{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SpaCy Tutorial\n",
    "#### 03 Advanced spaCy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import spacy\n",
    "from spacy.gold import GoldParse\n",
    "from spacy.scorer import Scorer\n",
    "from spacy.util import decaying, minibatch, compounding\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random\n",
    "from sklearn.metrics import precision_score, recall_score, confusion_matrix, accuracy_score, f1_score, roc_auc_score, roc_curve\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import scikitplot.plotters as skplt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using GPU  \n",
    "To use GPU, install spaCy for the right CUDA version. The GPU version of spaCy utilizes [CuPy](http://learningsys.org/nips17/assets/papers/paper_16.pdf), a GPU-accelerated NumPy-like library."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install -U spacy[cuda100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Make sure GPU is enabled\n",
    "spacy.prefer_gpu()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<CUDA Device 0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Use the first GPU card\n",
    "spacy.util.use_gpu(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model Training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SpaCy allows training new models or retraining existing models. This is especially useful for text classifier and named entity recognizer. \n",
    "\n",
    "1. Initialize the model weights randomly with `nlp.begin_training`\n",
    "2. Predict a few examples with the current weights by calling `nlp.update`\n",
    "3. Compare prediction with true labels\n",
    "4. Calculate how to change weights to improve predictions\n",
    "5. Update weights slightly\n",
    "6. Repeat 2-5\n",
    "\n",
    "Here, we'll train an NER model.\n",
    "\n",
    "![model_training](img/model_training.png)  \n",
    "\n",
    "Here, we'll train NER using [conll2003 data](https://github.com/Hironsan/anago/raw/master/data/conll2003/en/ner/)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !wget https://github.com/Hironsan/anago/raw/master/data/conll2003/en/ner/train.txt -P data\n",
    "# !wget https://github.com/Hironsan/anago/raw/master/data/conll2003/en/ner/valid.txt -P data\n",
    "# !wget https://github.com/Hironsan/anago/raw/master/data/conll2003/en/ner/test.txt -P data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Convert conll2003 annotation to spaCy format"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_conll_to_spacy(filename:str=None):\n",
    "    try:\n",
    "        f=open(filename, 'r')\n",
    "        \n",
    "        all_data_list = []\n",
    "        document = ''\n",
    "        start = 0\n",
    "        data_tuple = ()\n",
    "        label_dict = {}\n",
    "        entity_list = []\n",
    "\n",
    "        for line_num, line in enumerate(f, 1):\n",
    "            if line == '\\n':\n",
    "                all_data_list.append((document, {\"entities\": entity_list}))\n",
    "                document = ''\n",
    "                start = 0\n",
    "                data_tuple = ()\n",
    "                label_dict = {}\n",
    "                entity_list = []\n",
    "\n",
    "            if line != '\\n':\n",
    "                word, entity = line.split('\\t')\n",
    "                document += word.strip() + \" \"\n",
    "                entity = entity.strip()\n",
    "\n",
    "                if entity != 'O':\n",
    "                    entity = entity.split(\"-\")[1]\n",
    "                    start_position = start\n",
    "                    end_position = start + len(word)\n",
    "                    entity_list.append((start_position, end_position, entity))\n",
    "\n",
    "                start+=len(word)+1\n",
    "    except:\n",
    "        print(\"Something went wrong\")\n",
    "        return None\n",
    "    return all_data_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = convert_conll_to_spacy('data/train.txt')\n",
    "val_data = convert_conll_to_spacy('data/valid.txt')\n",
    "test_data = convert_conll_to_spacy('data/test.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(14041, 3250, 3453)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_data), len(val_data), len(test_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train NER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(0)\n",
    "\n",
    "nlp = spacy.blank(\"en\")\n",
    "ner = nlp.create_pipe(\"ner\")\n",
    "nlp.add_pipe(ner)\n",
    "\n",
    "# Converts to BILUO scheme\n",
    "for _, annotations in train_data:\n",
    "    for ent in annotations.get(\"entities\"):\n",
    "        ner.add_label(ent[2])\n",
    "\n",
    "# Adam (1e-3, beta1=0.9, beta2-0.999, L2=1e-6)\n",
    "optimizer = nlp.begin_training(device=0)\n",
    "    \n",
    "distinct_entities = list(ner.move_names)\n",
    "\n",
    "# get names of other pipes to disable them during training\n",
    "other_pipes = [pipe for pipe in nlp.pipe_names if pipe != \"ner\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['O',\n",
       " 'B-ORG',\n",
       " 'I-ORG',\n",
       " 'L-ORG',\n",
       " 'U-ORG',\n",
       " 'B-MISC',\n",
       " 'I-MISC',\n",
       " 'L-MISC',\n",
       " 'U-MISC',\n",
       " 'B-PER',\n",
       " 'I-PER',\n",
       " 'L-PER',\n",
       " 'U-PER',\n",
       " 'B-LOC',\n",
       " 'I-LOC',\n",
       " 'L-LOC',\n",
       " 'U-LOC']"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distinct_entities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Evaluation function\n",
    "def evaluate_ner(nlp:spacy.lang.en.English=None, val_data:list=None):\n",
    "    scorer = Scorer()\n",
    "    \n",
    "    for text, annotation in val_data:\n",
    "        doc = nlp(text)\n",
    "        gold = GoldParse(doc, entities=annotation['entities'])\n",
    "        scorer.score(doc, gold)\n",
    "        \n",
    "    return scorer.scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_ner(n_epoch:int=5, train_data:list=None, val_data:list=None, max_batch_size:int=32):\n",
    "    with nlp.disable_pipes(*other_pipes):  # only train NER\n",
    "        train_stats = []\n",
    "        dropout = decaying(0.5, 0.2, 0.3) # Gradually decrease dropout rate from 0.5 to 0.2\n",
    "        batch_size = compounding(4.0, max_batch_size, 1.001)\n",
    "        \n",
    "        for epoch in range(n_epoch):\n",
    "            random.shuffle(train_data)\n",
    "            batches = minibatch(train_data, size=batch_size)\n",
    "            losses = {}\n",
    "\n",
    "            for batch in batches:\n",
    "                texts, annotations = zip(*batch)\n",
    "                nlp.update(\n",
    "                    texts, \n",
    "                    annotations, \n",
    "                    drop = next(dropout),\n",
    "                    sgd = optimizer,\n",
    "                    losses=losses)\n",
    "            \n",
    "            print(f\"Epoch: {epoch+1}\")\n",
    "            print(f\"Losses: {losses}\")\n",
    "            val_score = evaluate_ner(nlp, val_data)\n",
    "            print(val_score)\n",
    "\n",
    "            train_stats.append(losses)\n",
    "            train_stats.append(val_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Losses {'ner': 15661.537846056572}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 86.15148292567648, 'ents_r': 84.74950598628385, 'ents_f': 85.44474393530997, 'ents_per_type': {'ORG': {'p': 77.28888888888889, 'r': 83.1261950286807, 'f': 80.10133578995855}, 'LOC': {'p': 85.30915853091585, 'r': 87.6313276026743, 'f': 86.45465253239105}, 'PER': {'p': 93.6266020090059, 'r': 85.83677357891393, 'f': 89.56262425447315}, 'MISC': {'p': 86.29787234042553, 'r': 79.96845425867508, 'f': 83.01268931641424}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 7101.599814165207}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.13430708941931, 'ents_r': 87.24863419737301, 'ents_f': 88.18139097744361, 'ents_per_type': {'PER': {'p': 92.815344603381, 'r': 90.66370276278184, 'f': 91.72690763052209}, 'ORG': {'p': 85.4608181370133, 'r': 82.88718929254301, 'f': 84.15433147294345}, 'LOC': {'p': 88.5470894462849, 'r': 89.3505253104107, 'f': 88.94699310672688}, 'MISC': {'p': 86.94929343308395, 'r': 82.49211356466877, 'f': 84.66208012950223}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 4599.354534214304}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.3205022884638, 'ents_r': 88.46913867255608, 'ents_f': 88.8927820602663, 'ents_per_type': {'PER': {'p': 90.4186046511628, 'r': 92.60082565893934, 'f': 91.49670536554754}, 'ORG': {'p': 86.37264618434092, 'r': 83.31739961759082, 'f': 84.81751824817519}, 'LOC': {'p': 89.25735637552546, 'r': 91.26074498567334, 'f': 90.24793388429751}, 'MISC': {'p': 91.55672823218998, 'r': 82.09779179810725, 'f': 86.56964656964657}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 3285.1332846054574}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.70727101038716, 'ents_r': 88.34127629896548, 'ents_f': 89.01903367496341, 'ents_per_type': {'PER': {'p': 92.3690932311622, 'r': 91.87043505874881, 'f': 92.11908931698774}, 'ORG': {'p': 86.14931237721022, 'r': 83.8432122370937, 'f': 84.98062015503875}, 'LOC': {'p': 89.7667777248929, 'r': 90.0668576886342, 'f': 89.9165673420739}, 'MISC': {'p': 88.69492934330839, 'r': 84.14826498422713, 'f': 86.36179684338325}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 2631.7233798145317}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.5025049516486, 'ents_r': 89.29443217482273, 'ents_f': 89.39834749214477, 'ents_per_type': {'ORG': {'p': 85.79682233991333, 'r': 85.18164435946463, 'f': 85.4881266490765}, 'LOC': {'p': 90.79518072289157, 'r': 89.97134670487105, 'f': 90.38138642360278}, 'PER': {'p': 90.51250762660159, 'r': 94.22038742457923, 'f': 92.32923603547533}, 'MISC': {'p': 90.98005203816132, 'r': 82.72870662460568, 'f': 86.65840561751342}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 2084.6085708388127}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.73513831665686, 'ents_r': 88.60862489829128, 'ents_f': 89.16832378055915, 'ents_per_type': {'ORG': {'p': 87.41258741258741, 'r': 83.65200764818356, 'f': 85.49096238397654}, 'LOC': {'p': 89.45147679324894, 'r': 91.11747851002865, 'f': 90.27679205110006}, 'PER': {'p': 92.25888324873097, 'r': 92.34677675452525, 'f': 92.30280907792412}, 'MISC': {'p': 87.5, 'r': 83.3596214511041, 'f': 85.37964458804524}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1790.3321938146837}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.89080662205001, 'ents_r': 88.99221201906312, 'ents_f': 89.4392523364486, 'ents_per_type': {'PER': {'p': 92.42761692650335, 'r': 92.25150841536995, 'f': 92.33947870311506}, 'ORG': {'p': 87.32673267326733, 'r': 84.32122370936902, 'f': 85.7976653696498}, 'LOC': {'p': 87.43243243243242, 'r': 92.69340974212035, 'f': 89.98609179415857}, 'MISC': {'p': 92.23985890652557, 'r': 82.49211356466877, 'f': 87.09408825978352}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1522.8071136429207}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.56134177809054, 'ents_r': 88.7597349761711, 'ents_f': 89.15873664545506, 'ents_per_type': {'ORG': {'p': 82.23920863309353, 'r': 87.4282982791587, 'f': 84.75440222428175}, 'LOC': {'p': 92.2244094488189, 'r': 89.4937917860554, 'f': 90.83858458555501}, 'PER': {'p': 92.51766217084136, 'r': 91.48936170212765, 'f': 92.00063867156315}, 'MISC': {'p': 91.00346020761245, 'r': 82.96529968454259, 'f': 86.79867986798679}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1312.5697353042779}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.86396407044084, 'ents_r': 89.36417528769034, 'ents_f': 90.10782934833568, 'ents_per_type': {'ORG': {'p': 88.14229249011858, 'r': 85.27724665391969, 'f': 86.68610301263362}, 'LOC': {'p': 90.18779342723005, 'r': 91.73829990448901, 'f': 90.9564393939394}, 'PER': {'p': 92.58441148627328, 'r': 93.17243569387107, 'f': 92.87749287749288}, 'MISC': {'p': 92.1792618629174, 'r': 82.72870662460568, 'f': 87.19866999168745}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1140.856167016318}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.40854660718477, 'ents_r': 89.51528536557015, 'ents_f': 89.95969861573508, 'ents_per_type': {'PER': {'p': 91.12903225806451, 'r': 93.29946014607812, 'f': 92.2014749725404}, 'ORG': {'p': 88.4920634920635, 'r': 85.27724665391969, 'f': 86.85491723466406}, 'LOC': {'p': 90.33930254476908, 'r': 91.54727793696274, 'f': 90.9392789373814}, 'MISC': {'p': 91.86851211072664, 'r': 83.75394321766562, 'f': 87.62376237623761}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1087.0706314740528}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.13289427260966, 'ents_r': 89.08520283621992, 'ents_f': 89.60598620367122, 'ents_per_type': {'ORG': {'p': 86.94390715667312, 'r': 85.94646271510517, 'f': 86.4423076923077}, 'LOC': {'p': 87.90506617982656, 'r': 91.97707736389685, 'f': 89.89498249708285}, 'PER': {'p': 93.07122139864647, 'r': 91.71165449348999, 'f': 92.38643634037108}, 'MISC': {'p': 92.19982471516214, 'r': 82.96529968454259, 'f': 87.33914487339143}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 1006.9654163974046}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.94616104868915, 'ents_r': 89.32930373125654, 'ents_f': 89.63667113780838, 'ents_per_type': {'PER': {'p': 91.31244182438721, 'r': 93.45824071133694, 'f': 92.37288135593221}, 'ORG': {'p': 89.75139523084728, 'r': 84.56022944550669, 'f': 87.07851341373369}, 'LOC': {'p': 89.71698113207547, 'r': 90.83094555873924, 'f': 90.27052681537732}, 'MISC': {'p': 87.07317073170732, 'r': 84.46372239747633, 'f': 85.74859887910328}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 951.3813020243251}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.90052662375658, 'ents_r': 89.29443217482273, 'ents_f': 89.59645439701424, 'ents_per_type': {'ORG': {'p': 85.88346755092373, 'r': 86.66347992351817, 'f': 86.27171068284558}, 'LOC': {'p': 89.72795497185741, 'r': 91.35625596943649, 'f': 90.53478466635116}, 'PER': {'p': 92.5925925925926, 'r': 92.09272785011115, 'f': 92.34198376054769}, 'MISC': {'p': 90.25641025641026, 'r': 83.2807570977918, 'f': 86.62838392124692}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 919.2392247494863}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.00350754121361, 'ents_r': 89.48041380913635, 'ents_f': 89.74119841454883, 'ents_per_type': {'ORG': {'p': 85.37383177570094, 'r': 87.33269598470363, 'f': 86.34215500945179}, 'LOC': {'p': 90.1608325449385, 'r': 91.02196752626553, 'f': 90.5893536121673}, 'PER': {'p': 92.45463228271251, 'r': 92.2197523023182, 'f': 92.33704292527821}, 'MISC': {'p': 91.62348877374784, 'r': 83.67507886435331, 'f': 87.46908491343775}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 821.9323778398393}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.22697871339527, 'ents_r': 89.17819365337672, 'ents_f': 89.69952063603412, 'ents_per_type': {'ORG': {'p': 86.3066538090646, 'r': 85.56405353728489, 'f': 85.93374939990397}, 'LOC': {'p': 90.20350212967345, 'r': 91.02196752626553, 'f': 90.61088661754219}, 'PER': {'p': 93.20294966335364, 'r': 92.3150206414735, 'f': 92.7568602425016}, 'MISC': {'p': 89.30659983291562, 'r': 84.30599369085174, 'f': 86.7342799188641}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 789.6986549803987}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 89.70450281425892, 'ents_r': 88.92246890619552, 'ents_f': 89.31177397700077, 'ents_per_type': {'PER': {'p': 91.39114160948222, 'r': 93.04541124166403, 'f': 92.2108575924469}, 'ORG': {'p': 84.1709722874589, 'r': 85.65965583173997, 'f': 84.90878938640132}, 'LOC': {'p': 92.15976331360946, 'r': 89.25501432664757, 'f': 90.68413391557496}, 'MISC': {'p': 90.90128755364807, 'r': 83.51735015772871, 'f': 87.0530209617756}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 799.5908558412048}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.7725068023187, 'ents_r': 89.18981750552133, 'ents_f': 89.97420262664164, 'ents_per_type': {'PER': {'p': 92.5984752223634, 'r': 92.56906954588759, 'f': 92.58377004922978}, 'ORG': {'p': 89.73577235772358, 'r': 84.4168260038241, 'f': 86.99507389162561}, 'LOC': {'p': 88.75631023405232, 'r': 92.35912129894938, 'f': 90.52188158202668}, 'MISC': {'p': 91.36442141623489, 'r': 83.4384858044164, 'f': 87.22176422093982}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 742.3240410685248}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.03621072304637, 'ents_r': 89.59665233058236, 'ents_f': 89.81589373106502, 'ents_per_type': {'PER': {'p': 92.60204081632652, 'r': 92.2197523023182, 'f': 92.41050119331743}, 'ORG': {'p': 86.27543776620918, 'r': 87.14149139579351, 'f': 86.7063020214031}, 'LOC': {'p': 88.90934192360793, 'r': 92.26361031518626, 'f': 90.55542535739396}, 'MISC': {'p': 92.09833187006146, 'r': 82.72870662460568, 'f': 87.16244287494807}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 659.5134500245222}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.6616167593798, 'ents_r': 89.03870742764151, 'ents_f': 89.84283368519822, 'ents_per_type': {'PER': {'p': 91.56288916562889, 'r': 93.3947284852334, 'f': 92.4697374626631}, 'ORG': {'p': 90.29889879391715, 'r': 82.31357552581262, 'f': 86.12153038259565}, 'LOC': {'p': 91.22807017543859, 'r': 91.88156638013372, 'f': 91.55365215322388}, 'MISC': {'p': 87.87878787878788, 'r': 84.62145110410094, 'f': 86.2193652069104}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "Losses {'ner': 763.9773517085305}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 90.62573789846518, 'ents_r': 89.22468906195513, 'ents_f': 89.91975634042055, 'ents_per_type': {'PER': {'p': 91.18012422360249, 'r': 93.23594791997459, 'f': 92.19657717067044}, 'ORG': {'p': 88.46918489065607, 'r': 85.08604206500956, 'f': 86.74463937621833}, 'LOC': {'p': 91.64666346615459, 'r': 91.16523400191022, 'f': 91.40531481924828}, 'MISC': {'p': 90.99567099567099, 'r': 82.88643533123027, 'f': 86.7519603796946}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n"
     ]
    }
   ],
   "source": [
    "train_ner(n_epoch=20, train_data=train_data, val_data=val_data, max_batch_size=128)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uas': 0.0,\n",
       " 'las': 0.0,\n",
       " 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}},\n",
       " 'ents_p': 90.62573789846518,\n",
       " 'ents_r': 89.22468906195513,\n",
       " 'ents_f': 89.91975634042055,\n",
       " 'ents_per_type': {'PER': {'p': 91.18012422360249,\n",
       "   'r': 93.23594791997459,\n",
       "   'f': 92.19657717067044},\n",
       "  'ORG': {'p': 88.46918489065607,\n",
       "   'r': 85.08604206500956,\n",
       "   'f': 86.74463937621833},\n",
       "  'LOC': {'p': 91.64666346615459,\n",
       "   'r': 91.16523400191022,\n",
       "   'f': 91.40531481924828},\n",
       "  'MISC': {'p': 90.99567099567099,\n",
       "   'r': 82.88643533123027,\n",
       "   'f': 86.7519603796946}},\n",
       " 'tags_acc': 0.0,\n",
       " 'token_acc': 100.0,\n",
       " 'textcat_score': 0.0,\n",
       " 'textcats_per_cat': {}}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on val set\n",
    "evaluate_ner(nlp, val_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!mkdir -p model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save the model\n",
    "nlp.to_disk('model/ner_v1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Weight averaging (https://www.aclweb.org/anthology/P04-1015/)\n",
    "with nlp.use_params(optimizer.averages):\n",
    "    nlp.to_disk('model/ner_v1_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "nlp_wa = nlp.from_disk('model/ner_v1_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uas': 0.0,\n",
       " 'las': 0.0,\n",
       " 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}},\n",
       " 'ents_p': 90.86431335757007,\n",
       " 'ents_r': 90.06160641636637,\n",
       " 'ents_f': 90.46117921774665,\n",
       " 'ents_per_type': {'PER': {'p': 92.58908861557869,\n",
       "   'r': 93.23594791997459,\n",
       "   'f': 92.91139240506328},\n",
       "  'ORG': {'p': 87.93774319066148,\n",
       "   'r': 86.4244741873805,\n",
       "   'f': 87.17454194792673},\n",
       "  'LOC': {'p': 90.96895578551269,\n",
       "   'r': 92.35912129894938,\n",
       "   'f': 91.65876777251182},\n",
       "  'MISC': {'p': 91.14139693356049,\n",
       "   'r': 84.38485804416403,\n",
       "   'f': 87.63308763308764}},\n",
       " 'tags_acc': 0.0,\n",
       " 'token_acc': 100.0,\n",
       " 'textcat_score': 0.0,\n",
       " 'textcats_per_cat': {}}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on val set\n",
    "evaluate_ner(nlp_wa, val_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uas': 0.0,\n",
       " 'las': 0.0,\n",
       " 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}},\n",
       " 'ents_p': 83.29101680570669,\n",
       " 'ents_r': 84.92357001972387,\n",
       " 'ents_f': 84.09937129951778,\n",
       " 'ents_per_type': {'PER': {'p': 88.78470970068518,\n",
       "   'r': 88.78470970068518,\n",
       "   'f': 88.78470970068518},\n",
       "  'LOC': {'p': 85.03778337531486,\n",
       "   'r': 87.6883116883117,\n",
       "   'f': 86.34271099744245},\n",
       "  'ORG': {'p': 79.71360381861575,\n",
       "   'r': 80.28846153846155,\n",
       "   'f': 80.00000000000001},\n",
       "  'MISC': {'p': 73.57357357357357,\n",
       "   'r': 80.06535947712419,\n",
       "   'f': 76.68231611893583}},\n",
       " 'tags_acc': 0.0,\n",
       " 'token_acc': 100.0,\n",
       " 'textcat_score': 0.0,\n",
       " 'textcats_per_cat': {}}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on test set\n",
    "evaluate_ner(nlp_wa, test_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test (spot check)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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YsMNNywe8IAHFB/84Aezyyx1XXnllcWmm25aPPWpTy2uuuqq7DJq6aoPuXS66Hvf+16x9957FxtttFHxiU98IrvMpNJ0XT4aGtLUdO0OhuvJJ59cbpd7i/3337943eteN/H2l/L5yAWT+urIq68unnLKKcV6T3xi8X//2Z+VbcSfP+QhxUa77lrs/YEPFCf+8pfZ9ZaSNMSWjrqSS6OrDvvSl4oHbLJJsWr0DP/in/40u8yksoypWakPuXQm1SGf/3zxVw97WPFnD3xgceAVV2SXUQq15T//8z+Lf/mXfym22Wab4kujdrsPue330Ut+/vNi70svLR41eq67/4Yblu07evBmmxVPOvHE4phrr12w/BDXGevU4qqOeI44/PDDy5jtcuDmm28uDj300NJs3XPPPctnn3e9611zcxcfTddhWe5eQh8++tGPFptvvnnxjne8o/jjH/84N3U8+nrNDGK6XnDBBWWjkyrefI9gTKorRhc88OQMz5o1a8rGkAqz0hmyoVyMfJ3UdP356Mb2uOOOK9dHcYOw3377lW9nxXTr370sZdP11a9+9fzDybHHHltcf/312eUm1X/8x38U73//+8u2+pOf/GR2mb7SdF3e6kMunS7SdFWphoY0NV27Q11km2eccUbxpz/9aW7qeP7whz+U15VTTjkle9+xlM9HLpjUVSf+6lfF6ne9q/hvf/EXZbuA4fqQLbYoFebrNE2sLnrhD35QbP+a1xTbnnZadr6G2NJRV3JpdJWmq1qX1IdcOpNqp7POKss8woQ66eabs8sp1RZiYNxXMTIJBmwfctvvqqO+851io9Wr58s3puv622yzwHzd/6MfXbDOENcZ69Tiqokf/ehHxW677VYaPF2eJRaLd7/73eWzzyWXXNK7Lk0TTdduUOa++tWvls+klMUqmq73mq7j8kpfr5mpDS/cpkJ6coZnyEZV7mUx8nUS05ULAzcxrIvx+v3vf3+tmxnSv/rqq4u3v/3txW233TY3dWUz1HlOTYIh9I1vfKPYYYcdiic/+cnFdtttV2y11VbFF7/4xeyyk2oWJpdanupDLp0u0nRVqYaGNDVduxP3+F/+8pfnprRj3H3/Uj4fuWBSV+3zoQ+VvS0IIu79z/9cvPSmm+bn8ffzPvvZYofTT18SpivBT9quJ770pdn5GmJLR13JpdFVmq5qXVIfculMomOvv754+M47F383es572E47Fes/6UnF0aN74NyySrUhYkmHHHJI8euW6+TIbb+LTvjJT4rHPOc5ZXu++RFHrFWuKfu7jO4rD/rkJxdMn/Q6Y51afDWBcfmh0X0xnUG+/e1vz01dmkRd2nHHHcuOD0sRTdduxDnluXMaMYZ1iXF5pa/XjKbrOsaQjarcy2LkazRuXS9sv/jFL8qhg+nZSo/F5fDm2FJhqPPMxWhI/dM//VNx3/vetywPiIcWhjPJLTupNF1VnfqQS6eLNF1VqqEhTU3X7vR96B5337+Uz0cumNRFDKv3+Oc/v2wPnv2P/5hdZilJ03X5qCu5NLpK01WtS+pDLp1JRJvLiAfbnXZaKcr+sy66KLusUm34whe+UMaD+ETRJOS230WYqbxwtskeexTH3XBDdpmcJr3OWKcWX+PgZQBeCjj11FPL0XCWKuNMp6WApms3lsM5XSqMyyt9vWY0XdcxhmxU5V4WI1+jcetyYcNgZbg/1lkuQ3UsJYY6z1yMhhLD/R555JHlt1z5JgvDPqy33nplu3nttddm15lEmq6qTn3IpdNFmq4q1dCQpqZrdzRdu4seFxtuv30ZQCSQmFtmKUnTdfmoK7k0ukrTVa1L6kMunb7iO95bH398aUxhUD3vM58p/nKDDYrHHXpo+cJObh21sjUODCyMLD4r9ctR+ZqE3Pa7aNd/+IfG+4k6TXKdsU4tDbWBTiIMafqd73xnbsrSY5zptBTQdO3GcjinS4VxeaWv18ySMl1vvPHG4rTTTpv/3uS+++5bfP7zny/uvvvuuTUWwpAE11xzTfGSl7xkfh2GVL3ooovKj3P3gf248MILi7322qtMj7fDDjzwwOLjH//4WgYW+/X1r399wfb55X+m5/Y7Gj3yJ0ddga1OJxDNh8dJ6yMf+ch8fudUt606uuQBN3Sf/vSniyOOOKJYtWpVuTzf8+X7kwxxmxvvPm34Wf/yyy8vz3Wsi1n4m9/8Zm7pe28amf+5z31uburaxDj7XLihLi8D9o19ZF/jG8Rx/mLc9i752rc8Uu7TfYh12GcaN6a1vbBh0G2//fZlT1d6vE5Kdd/i/OQ+eN/1vFYhjzjuKHeUpxNOOKHM02o5qp7ban0I7rjjjuKyyy5bq3y2OYZJ4GI0lPj2KTeilAuGXuGG9JnPfGax4YYblm+u5tZBmDw84NBLlnVe9apXFY95zGPKafzS1pJvsTxt1hOf+MRyfk6kk6ZPHbn00kvL7wQ/+MEPLpfhl/+Zzvx0eYRphnmGiZbbNuLvz4wejA466KAyPXr4UqYvvvji2u/YMv1f//VfF+wLx8gxc+y5dVR39SGXThd1NV0pC5Qf2mHqTZTfLbfcsnjb296WfVEhNV2Zz3IsH2Wa9oPvWFTXC0X9iu2xDuWX/dB0HVZDQ5ph8nEN4nrDdYfrBfc+nHvOb+5eBuJaxz0Sy6PDDjusbLdz94BM+8EPflCcddZZxS677FJeb8atA9XtpNdH7g9Ih2PoalSSbtt7uHjgYpmcmu5TIp9z66UPcLM+H13IBZO66ITR/VQMr9enpyvfgz1gdGyP3m+/4s8f8pAyHX75n+nMr64TplVdoPNFo3vGDZ7ylFL8zbRYJ6c08JkaYgQwd3/Pe4r15u4h2K+tjj22/C5suj01HXUll0ZX9QqG33xzGfhOy/D/3HTTYsczziiHn6wun5Yxyve+o3vzh43aB3ou8V3kR+y+e3HQlVdmv9HH8oeMnhm3Ou644oGPfGSZDuuxPulU60u1LhzxjW+UPdPZz1hvv9HzRNP3AI+8+urym4Hp9jYYtad8xzl3fIi6ybK85MAy5AV5Mp83Z545NVNb3as+5NLpq6O/+93ib7faqthk9Bxz/I9/XJaFR43uff/qYQ8rDvn857ProLT8vGh0zd5ydK9J3dh0dA/64p/9bK1yzRD2j9pnn3KZajtd146TbmyPZTCtmL/36FkvplfFPJYpvwnuNzSnonH8ZFSGiB2cc845tfdMbcltv4v2+8hHyvIwy56ufeuUGlZtiPglsdxZ8LNR20i9SJ/DeG6gc0M1Zhsxx+qzC6ozoHJQB8fFnVPYbhqPR/zNNObliLh19XmsLr7JPhHrfefoHivdDvFbnqV4pqqSbiOeuSLey/GcdNJJZZpNdMl/GDru23ROUeRfdbspaT5EDJv2lmkRy296Jq+L/xMr7xL/J261zTbbFMeOrtW//e1v56beC7Ez0spdB26//fbiBS94QZn3cXzVstI3rzi+Lr7eus6SMV05CRQ2KjwGW1R8KiGVpwqFhulUKE4mPcEooFF5Dx3dEN48usnrAt+mioJPOqRHuqTP32nFoXIRZGVZ9uHggw8uXve615UFKgI9DP9ZNSmjIFcNu6BaYIN0+le+8pX5So1I84ILLij233//+ePnl/8R89rSJQ/IXxo1lo1zQOOx++ghmGnkC+eoWsEjDzBR6JXJuscff3wp/mYeFyAaziAajDe84Q3Z3pvRaJAv3GRCXV4CaXB+4lxx3ih3cf6ioWmbr33KI+tgmsUxk2/sA2WJdAjSR/62aXThfe97X7n8EDfYURaifLNvcW7J5+oNQp/zGqRlqZoPnA8uwunxjKsPkAaIOQ9HH310+X+Uby7WVeM1jiHS6As3YEOJb+7yoELdimm0NUzjN102VZiulHPydIMNNijNK24Q73e/+5Xz+Dg8N7osz3djn/3sZ5ffiw2z83GPe1zxhCc8oRTnINIm6M0FmjRI6ymjh3mGhsGoYj300pe+dD7tUBvTlRtulsHA4vyGkcV2uNFM00OYbGeffXY5n/3eeeedy/Q33njjcj2+gUtZrq43tMJcqyr26T3vec8Cww8TO7d8KDXp6tKOvKcczMJc7kMunS7qarpGGYvyWy3zuXIZ+Us+ku+cM+oM4m/m8U3lnPH6yU9+sqwfLEMd44UIxN8Y/7RjzJuF6dq1DI570SJegmDZuvJKPlPvTzzxxEZjeigNDWmGycf1mAcX2jauQXH95vqVuwan94EsSxpxv8Q0HvKq9yukwzyubbwcxXbYXtyL5O53uU7xMBX7kt5f8D8GLvOY1vSAV6XrPdxdd91Vbov7n7iOsmzcE9EG1bFmzZoyfY6ZdOP4WY/pzIdZn48u5IJJXbXzm99c1hvMlOq3y5pEsPBxhx1WrkuwfMNRe7TF6NjWG9VRjB30lFe+csE3YlGYVl1M1z3e+95i/VG+P3izzcp177/hhuX/CAOLQD7LRdocE+kToH/k6NkNhaHGt9RmabxipGHCYQqw32l+1RlfBHIJ6LJsVaRBkBazLWdqI0wIDAaWi20i8uChO+5YPP2tb516r5qu5NLoqs7B8FF7Q2+nMHs22nXXct0wKPne3jGj61O6TpQx8pDyfd+/+qvSxKTs/83ci1GUfc5t1diJntps729HbQBlgnWjvrAv6fJpXeClCI6NbbBebIu0skZTcmwsR93ZfPRMyjFGXdho9eq1jg+FaUa9o+5QhsgXlo/0tj7hhLXq9jTFtvYd3fOndTnO2V7vf3+2PEd+V0Ve005tO2qbm9oC8n+n0T0MdTWOG1E+qFsHjK4HufWGUh9y6fTVMy+4oDzenUbX2JgW1wt+02VTRfnZa3SPhtEa+Rb1Mi3Xu42eryhflK1NnvWs+faKdhqDaptXvKLM++p8/mekhthmGKpbvvCFZW/CdH8Q5YMXFqKHYXX+NMR3OiljUVcR9ZCXIHgZorr8pO0+03nZifYh2jBE/pHX247uWY4f3dfk1h1K44jYWVOHhbbktt9FnB++p0oePeHFL25toE5iuvatU9PUcT/6UbntuBaxL5QfrheHXnVV9gWFSdtWyv9TTjll/n4x1qd+0GYc/pWvZNcbSm3ALOI5p844Goo0XhvPMDz3pM8KPBelMdvbbrutjB3QY5xleFbjJf/q80sTbePOQTUef/LJJ5cvoMa0PfbYI/tM3NV0jWeuOCaemzj+yJ+clxHb4MVynrlYlnXIx/Q57UujululT/7D0HHfpnOaPs82eQmRD1dccUUZ62Y71fx705vetFb+kQdDxv/DA+E8VssE28Y7IS2WYdmUMGxTf6VaVvrkVVdfbyWwJExXTiCNx5WjB+Vwv/nlw9qcHCoJJzyFisx6BPpS44Q3LujpyHqYFdWCXgeFjjdsqDDpfgCBHCoUAScgTYI3HB+NYNW4ofGll0uuYEVB7mu6EkDGuDr//POzwbVqRelClzzgf46dY+RY+D+gMfnWt75VVjbOUV3DTyPD2zBp70d6Z2JQMp+bxeCm0QMgx474u8rVoxsKzJm00ajLS/bvkksuKbdB2apeLPm/eqEYl699ymPkN40kecR+BVGG2CZq0+iSdjSsk95gY6hy/tiHNH8oE5QNjpULS1oG+5xXiLJEmtVyF/lQvZC0qQ/8j0lHGmnexvbYl+r5HHee28K+DiHKCMdZ7dUaxtJOO+1Ulv10nVCYro997GOLY445ZoHJyVtpGEIxZHG63jiTC8PqxaMHJtLmAlw1Wug1xQUcMwYzNJ0X+036OdMVc4j95XxGr1bKIoF+0ssdLyY/63FBT/eFvMNEYz1uhqpG29CqM7xSYR6EOTqE6ZqqzhQcUn3IpdNFXU1X2pDXvOY15TUonc5IDZT5XDqRv9zsVssRPeQw7plPG56uF9c5ytgpowdaylzM4zxzwx/nZzFN11RpGRzCdE1F/mJCp/s0tIaGNLm+UH94+OWcxvWC6zfnnGsCDw3pG79xH8i1nWt8Oo97AO4FuCfhwTmFvOfetnq9insIzk96v8J24pMBr3/96xcEI9L7C+ZXr8lNTHIPB23u8XPU3ZcFsz4fXcgFk7qqap4SEB5nSmKAEAxnHQJk1eVfMKqjDFucM5L6mK6hCPTVrRtpE7hbNXrwTvfrqFE5x0RjPoHPdL1pibyllxfbrNP/GpWBag+XpuB7Kky/qsFw8Oh+B5Mot3yoT7C4q7qSS6OrugbDMTAw7ujtnZYVDBqC0JTfJ7/85QvyOC1j5DNlPeYRnN5n1JaSZq7nEmbPM0ZtQnXfYj8Ieqf7EXWBef/r8Y+/pzf6XAAcg4W02Me/f8Yz1uqpFWlSvp777/++IHBOucRk4Dg2e97z1tqfMM3YZtWMoKcuL2jM0rwiT+gZFuU3J0w46ni6Xp0xkIpjqQb4ad9Wn3vuvMFXJ8pCut7Q6kMunT6iDmDeVctx1LFcmQtF+fnfo/vNRz772cVR3/72gvlRrim7Zfs3KlMxj95/MfoCPQKpZ+l8XhKIdvxZF937Hcww0FgHszamh4745jfL8oxxmXvRZVCN6hrXGOpflJWquNbyYkZqoFLP+rb7R47uS8jr3PKh3DV1aI2D+6WnP/3pxY9H53lSctvvKnq7Rj0nf3IjDlTV13SdpE5NS5j0bLtaVkLUUczR6kstfdtW8ovv2KYvseRE+ul6Q6sN3Oe/eXQfgB/w09F+T4t41mI7jB5XjQ+yDzxj8EyfiyvynJUzt5pgG13izhGDzcXj0+e+XOeRumezuvgmbQNxtGqHmNiH3LHGNsjDatybfQ3/Jjesed/8n1bcd9w5bXpmTfOB/U73hxGtyD+eO8OUDIaO/0OM9lmN/5P/nAf2g9gs206JckFcLKgrK23zKs5vWnbTcpHz9VYCS8J0ZTkqT1rogBPCiakWEioPb3vUDaGKi//CF76wrJg5g64KDRgBHArCZz/72bmp9RC8p7LwFkJdoYkKVS1YUZDJnxx1lTvNKwJwqXmXUldRxtE1D+LD/AS30+BWCumwTDU4FvtYd/4wl5ifGqj8ElBmerVBodycd9555bbYr6AuL2O4lbrt52jK1z7lMY6nKb+54NGwsd02jW40hm2XryP2jfJbbZyB+aeffvpa9bLPeYUoS9yQVNsA+NSnPlWuRy/eoG19qIPAa25fms5zF7gYDSHyDMOVnnNhlKAwojBNP/jBDy5YJxSmK2W9akBhaGKMMz/tQYvGmVyxT5RNesdW5yO+O8syBM7TZcaZruwPbUoYriHSIC2+ZUvaMZ08IW+22GKL0hxL10EYtKtXry5vNnLzh1RqeIXBxrXi3HPPne8tiTn33ve+t5yXmljV/KgqlzbtAzfK5HPM443E6rpDqg+5dLqoq+laJ8pUmKDVHtORv5uOHlp5czOdhwhcMP/5z3/+AvOec8k55e3BnKlP+cTEZd1Zm65tymBa78blb668kqe8wEH9i3lcg3LrD6WhIU3aMq5BvFhWJe4XOOb0fjLuA+uuP9+l10jl7dEm7rzzzvJN0up1NbZz3HHHZUeJIG1GtuC6Rd6nD31NTHIPB23u8XPU3ZcFS+V85MgFk/qIgNpTX//6+UAYvwTG6oLTBAwJHFZ7G6ViyFaWocdSuswsTFcC+QzFWp0fvUzqekMNKYKLGFpsDzHsbGnQ3Xxz2bOEXkcENJlXDU5Wg+8RgIyAZUzHRMBMiPWeO2ovI4BK2hjjx1xzzbzhRkCX3oLbje6xugSL+6gruTS6qkswnLKNAUOP06pZh8grhp2smjhRxthO2QsoWafUKK+f9qY3lctwrtaan1EM8823/ag3MT3qAmmRZmqcIuoV9au6Xhwbpk9puCbrhCiDmDSYpweO2rV0XphmzGe5dB77wPCszE97a01LGK4cI9tDmx9xRGmwMY9f/o951V7sqTEwXyZG+4+Jx3mPeel5ol1gOOWom5znZ42e9aItxJChPDxjdA+Wmn7TUB9y6fRRtPFVkzLaply5CUX5qatbabnOGdect8j/3Asy5DvzFlwHRueVF4aYnuv5HW3/tI1yxItGafnZ+5//uTTyEX+nbXT6UlLkLfNQ23af6wqjPsR8evQyLcxD1udc8QJJ3fV6KDURMaG6e62u5LbfR4d98YsLXlTi77oh4svlO1xnUk1Sp6Yhyle8GMBvvBBEueG6kZapqtHfp21lmfQlNNLH9A5Dl/rBfRvrTPuFnrYQe8uZVEMR8VpMIQy/HDxn8bzFfhBDShlnOtXRJe7M8wnP8nXPQMAy8TIuMbmUumezrvFN4rFhgFbj7rENzMFfjcpvlXT/UjNvkvyfVty3rZGYa0cjH3LP5+FNMD+NX7c5v+EhsW7bZ2yWI83qSJdMJ78xZZmfDsXMvpAflM0YJRTqykrbvGLdLr7eSmFJmK51mZ9W+DQdlmWdpiFU2X7bhjuCPDQENAjjiCFcmxquKJjVY4uCzP7lqKvcMZ0K05SndRVlHF3yICrpuH1hn+m1UQ2OxT7WBb8I5O64445l/pGPAdtim9X1ohJXDe66vIzt86ZQW5rytU95JD/Il2qvlpQIwrLdpnwOosw1LR/HUVW6fOxbNf9TIp30YhrTupzXKEtNNzBRNhkX/o9//GM5rW19qCPSrB5j03nuAukPIQxRbpa5QFfnhRHEkBw5wydM16qpGsLkZn7VDBpncjXtUyjSqJqkpNdkulaXD6WGGeZPTGdZ1mE4GpZJ1wlxfLkevUMrZ3ghzg1mXcyj1y3TJzVd0fe///3ypjfmNZ2TIdSHXDpdNK48dlHkYzWfYnrVVA1xY/zwhz98wXmK84qJmZbJqs4888y1ztu0VFdO6srgpKZrzKMdjXnTPs6hIU2uBRxTep8SxHW4eo3iPrDp+hPXqNxwPnXk7pvb3G/Gw2TTNTtl0ns4aHOPnyPypXpfFiyl81ElF0yaRBgW8f096s5fr1pV7P9v/7ZW8BGzhflNAewIJFYNoTCtpmm61pmqBFcfsPHGnYOlfcTQrBF4zw1TS4AxTAK09agNjH2OvIt5EXxH0WOL6QR+CQAzPTWn2G5ueNtZqiu5NLqqSzCcMknZ5BzU5RPlrNqjc1wZQ1HOMFIxVHPLVBVGVXquoy5U69C8RvsdPVbT9eLYxuVDHEvVPI19qTNV41uIdfVwMI2Ob/vXvKbcFqJXfWpWIP6PnpEoHaIzawzMzUtNrPQ4WCeMCF6GyBrrM1Ifcun0UVMbHwZm2malivJTV7eiXFNHqCvV+c//6leLBz360bW9VuvKN4YV9bVaN6OHIedzQc/0KQjTiJd+OH7KET3Oq8vQG579ZBl658ZLBH3afdZJX+7hRRuuLbHerNUE9znc77S9LxxHbvt9hdG49wc+UDxk7oVNrqHcC9HzurpsX9N1kjo1tDDfeWkujjV3v0Dbx3GyTLV3bp+2NX0ZIXdPNEu1BXOvz3NFWyJeO65ORCwwNcuAdVi3+vwxjkivTdy5TXwYyKNcTLzu2axPfLNundhGNX9S4rkUHydi45PkfzzDDR33HXdOm55Zx+VD5AHLBW3Ob9f4P0S61WdczFa2Rd4zPy0vbJ951TypO+9t86rqfQV1vt5KYUmYrnR7rnaPD3LpEBhkWhu1OanRyLf5eDemD+ZPG0M3hkGj0gVRkNMKmBJ5Uq3cMX1cQ19XUcbRJQ/iRo6u401DQDAUMd35MdowRILYxw+Mbrhy1DWMYa5Wg3GcYxph3ihJTc9cXkawsa0hHzTla5/yGBee1EisEo1bul4T6fJpmUvBPIgx2FGMc5+mT76QP7HPTUrzo895jbJUTTendL229QF4iYCekvTuYrjZGJO+miY0necusE+TKnp31pkhDOPLcJ58g/WLowfp6nzMD262MVer81CYKFWTpMnkCpOvjYmJsVPdPuk1ma4cS90QuXE8qcFFz06mtVGTMTaE6gwvFPuezmsysaqqSzvOVcyzp+s94nrDEDZ8w5QbV3pD831XDFLyqc50xSBNp4dy5Za3NHk7kOGw6RFYXScUaVfLxDTUtQwOYbqS17z0EPNoU6vrDqmhIU2uI5QTHnSqxHU1vdbEfWB6fapT9V4OGGaHeyfeUH7b295WvlDCsPyxTlyP296vsDzrVa9ndUx6Dwdt7vFz5O7LUhbjfLQlF0waQnxvix5kBMiqgWMC2G2/jUfPGuogJk1MC6OnzrAZwnR9+qgM5+b3DZZ2VTV4nuuthcI8YJm091J1/TT4HsdQXSeCtijbQ3HG6kouja7qcn6jt1wbpflfZ1SmairDBPc5Z8+88MLiyaN2Y+PRNZshVHPbinQwZtIenKnC4ErXi2NLexnlxDdJqeMYt2nAPdJM622qcfVwKHHMDLnMtpp6gcX3PFE6RGfsJ1pQJkbHmr7wEPkU5lxMz/UunqX6kEunq6IHNXUpzL1UGJcYmKlhmCrKT85cQuPKdVP9QXX1HIOMYairPUFj+VkYWtE+IMpS9OJLFfsZy0WP6T7tfhjNTK/rWTxLNRH3Wm3vC8eR2/6k4nzteckl5Qtn5GnuRY8u15nQpHVqaFG2wgBlv3I9oKkrvMDAMii9nnRtW+P4mcZ26fEdaS2G2hLPMmlvvCHhGZf0x8W6ib8RV04NQ8g9f4yja9w5YrBN8WFgWGCGDq8+K9U9mzXFNzlGeqwSV2RkLDpg8c1O8iC3Tmyj2gM2JZ7l0vZnkvyP9qxN3neJ+447p03PrJEPdTH3KM+p5zON+D/Ec3BqeMZ3kokNkSbzU7M3ylrVNK4rK23zqquvt1JYEqZrriAHuXSiMPCR5NRAyqlNA1dXuHKMK3ApuXRjWloBU+rypE1eQZdjSemyXtt9gabzV7etXEMNNLzRVT8aei5mNCZ0w6c3T0puP7ucv5SmfY55Xcoj+cE6deUAYl9Zrm3jFEZ/09tHKbnzE/uGIZs7hlTp0Ah9zmucI76lyLAbuW2E+K5nfFO4TRlkG1zY42PmiHN02GGHlR9+50JTLWPjjqEtHOukYthgzM24mW5SzmwLk6XObAwTpWrONJlcXQywMID4jWmsUzWvUJg/iL9jeqrc8cQ2Nt544+IJT3hCo5ZKT9foeTyp6cpNVXyzlukY9H7T9YfzH++P/CJ/MFwxXnfddddyWlomUeRvdXooV27blFkUaVfr2TSUKyeorgxOaroyxDXX5Bi6eDl/07V6LQjiOpzeM8Q0Hgp5MM1dr0I8EKcjcJBvBx988Pw1Ka59mJvPfe5zy2lxPc5tO0dcs+uOoUqb62eQu0eAuunjGLftWZ+PLuSCSYPp5pvLb0hiuqbD9UZguC54mCoC0GnwPabVGTZNAfdxZk9ue6n6BEv7iID4fK+kmt5cKI6V5VAE2euC7xgUaa++GPKvGhxtMgRnpa7k0uiqLuc3ysoDH/nIcpjDJuV6utaVMVRXhqvf26VHOUYJgf2/m/tOe5zrpnRShcGVrtdmH1FdfuXSTMV05tfVw6FEvqc9AuuM5zgOlkvbpdhPFMeI6Y2pkvZmjaG96VVJ70qm1/YunqH6kEunq1Ijb5zCMEw1rvyMK9fj5jfVc3o6V/eLeoDRs8/oGTZddmjFC0mRN3Uv/6DIIxT1qGu7z7zoPYmaet/PSk3EvVbb+8Jx5LY/lF40epaIPKe3ffryRZfrTGjSOjW00t6o1ZduUsW1BKXH27VtTV8wq+vBPku1JZ5lJo3B1dE2xlf3HJJ7/hhH13UiD5riw1D3LFX3bFZ37D8ftaMMj8s8FM9RGK/EEXLrtHn+y+XhJPk/7tkRWLZr3Hfc+Wna7rh8yJ3LNuc39qkp7RzEcFgnXloIgzc8E/I9Nf+r/wd152mSvAralJ11lWVpulKYmNbWWBpHl/Tizf+6rtMpYYCl+x4Voq6y1eVJm7yCuooyji55QMCK3m4EXnPDvwWRV9XKOW4fc41tEA1IdI+PD0Tnls3lWZfzl9K0z33KI2WCddJu/lX6NLrRY7nNMNGQq1/xhlHTvuXoc17blqUq4+oDBn18tJ6biRtuuGHBsdSVsXHH0BbSn0SYJAwbXN5gj24eciYiYh7LkA+U5zQNbpaYN6Tpes0115T1rW4Y4FTR0zXdfs68Qn1NV8ov0+qGUJ6lcoYX5zH9nmaap6mJlVN6nGnaVWEqckM5bcMV9SGXThc1lceq+HYxhuv97ne/sm5TltJhpyMf+U3Xq5seypXbKLPcsDZ9LzjSrtazaSi2lW6vqQympmtO6T6PK6/ke+57uENraEiz7n4D4jqc3sf0vY/gWz4YrLzQ9KEPfWjBEEBQvR7HtsdtJ+4n6o6hyqT3cJC7d2jDuGv3LM9HV3LBpCFFAJfeQdSn+d44P/tZaRK1MSWip2safCcdptUZNk0B9wj01a07zmzqEyzto9QEagowxrc8WQ7F9/2qwfeq7r/hhuVwgNGLqrp8+k3DNGiaqi6PhlJXcml0VZfzS16TD10N6nFlDIXpnva6pAcaBivnjm/nxfRQzqgaZz6h3Hptjy16ulbrUy7NVOPq4VCK7SB6BuaG+kSYUpiyLMfxcFxMT9fPiR7h6bef6+ptXX1kWdaJ9YdWH3LpdFHa5tMDO/cSAore2bnenOPKz7hyPW5+Uz2PHoOYn+wXvRT5hmZdb74h1dQOV4UhG8txPeW6WlfOQtV2H0Veo7S+15X9adfZJuI+r+194Thy2x9S8Q3WtB1HXa4zaIg6NbTqyk1VMZQ82nD77efrUNe2ta4tj7qerovq6v5QaksMx9r1uaItbeO1EQetxupzzx/j6Pp80jYGGz1dq/W77tksF9+M76cSS8Ss5Jks7dlbFxNt8/wXvSjTHp2T5P+04r7jzmnTdsflA9OZnx5HTKv2ok6JfWpKO0ccY5Qdzls6ohXlj3LIiJTRMzY3zHHdeZ8kr4I2ZWddZVmarlEZm7pmdyHSO/XUU4s//OEPc1ProWFin6ofr06JglltZKOypRUwhQAxQ7lV86RNXkFdRRlHlzyIikpjWv3IeAr7SWWuBvbG7WNdwwgYiRiKkeYXvvCFcr9z56Iuz8IMbzp/VZr2uU95jGOk2z/d/3OkQ++2bZx+Pbq5OeSQQ8r9qftAd0qufsWFvDou/Dj6nNe4Gcm9adPEuPoQeVcXVI4LT7WMjTuGtnCskwgThzwZN3QpwwozJO+Go4dDynM6L2dSpgoTpWoGjTO5yDPWox5V54Uija7fdO1qul46esjGdOTBkqGP0+VnrdTwygnTizwLE3CciZUeZ1PamF0MpRvLTlN9yKXTRV1MV3oz0zu87tusdd8jjvytTg/lym1dGa8q6ku1nk1DXcvgUKYrL4BwvYllp6mhIc26+w2Ie7nqQ0bcR1A22sKyrJN74OQBiQel6vU4rtFNwzhFunXHUGXSezhoc4+fY9y1e5bnoyu5YNLQyplM0UuibthcFAHkqjkbwbe64G98DzMXdBu37jhDrGuwtK/qzJuqqkH2eWO7Mj0VptIOr3vdgqBsdXlN1/HnNwzHMGdyy+QU+dnUO4hyStppz7N42SAX4GaZ6KnMujF9nPmEInierhc9RMcF7+NYqvuUSzPVuHo4lGI7qMl0TQP3HHf0TE7XrwqTo9oDva7e1tVHlmWdNI0h1YdcOl3EMXPs1SF6q2IIVIzu6rce0bjyM65cj5vfVM8p75T72P8wzsa9gDCEmtrhqtJ2OdqgunKGcu0+irxGS910jXslno/7ju6Rktv+kKorh12uM2iIOjW06spNVWk5qhu6vapc25ouv5xMV2JvxC+Jq06DMALHxbojFlh9Vqt7/hhHPJ+0iTtjkGGU8Tm9pnrLsxd5VTVn657NcvHNyI86g5fjr64DsY26z8lBLg8nyf9pxX3HndOm7Y57DmY681kuiGfcoeP/EMMJ89xOHvCcn3oTkS7TbrzxxjKviBtVz32urMAkeRX0jR2sCyxL0zV6NzKkbJu3RsZBo0bjxnjffKdtHASpaDSOOOKI2gaR/WL/qj0Oo9K/cPTAlzO0oqBX86RNXkGs39QQ5uiaB1w42M5rXvOa2oYTs4gLQrVC11XmIBqkasMY8CFy1v/Upz5VXigoC5SJKnV51ub8VWnK1z7lMRo+9qNuLPgw3thul8aJ4Df5Th4SVG8iV7/C2CYNzmFb+p7XOJ9nnHFG9qKfY1x9aJqfvg1V3Zdxx9AWjnUScYPGjXCdeRRKe8Qy1Gw6b1LT9eEPf3jWSIlhjzmX3BhX5yNMKIxghnTlJium58wr1Nd0TU3ncT1vp606w4uhj7kJwjRJl09NrGp+VJWmTT5w3tOhhZvOxZDqQy6dLory2MZ0rSvTKHrBMp/8TOdF/lanh+rKLe0H69GrO1dPMcO53tft09DqWgZT03Vc/lbLK/X6/PPPn+9Bu+mmm66Ynq4QL3zxRi1vC7eh6foSvWCZn16POSe5a1XA9frEE09sXCbHJPdw0PfBKa7N3DPlvvkyy/PRlVwwaUilPTTS7zvGUHkbrV5d23sIo5XgIb2M0m+ixTBzm+yxx1q9/VAEo3NBtwjc1RlesS6/1Xmoa7C0r57/1a8WD3r0o8t9aTu8cNpDrxp857jT4Q5ROuRhdfm6YS3TQGtdHg2lruTS6Kou5zcNcI/rsZ0qyljd9xNfetNNxZZz94bpMJFNZTN6wTKfcx3To3w0BaBzBld8P49hHp/77/++YPkQ3/ylN1If0yzq4bQNnDDG2Vbb4YWpd9Q/psd+IsoE7VAMmc60dNj0ajp19TatsyzLOtVlhlIfcul0UXwbetxQtem1gSF903njys+4cj1u/rh6Ht/4pf5hKM3CxEIxCgTbRm2HF2ZECKZ1bfer6Yy7LqJp19kmiHXQm2rct/vbktv+kArDnvxnVIqY3uU6g4aoU0MrRiFBbYcXjh7ZTO/atqbL17XlaftbV/eHUlt4rqDTB50/pkGbWHf0/sx9tq7u+WMcXeLOPI9hSvI8U9d5hucxYqYsw7NPSt2zWe75k2WYxjpVIh+q60Bso+55K9blmIkVBJPk/7TivnFO6fDGC+lVmtId9xycy99pxv+BjoGsS0yUtj89d+TDOeecU8ZwKFssl3uhO1dWYJK8Csbl2brMsjRd08rDG1xr1qyZm3MPNEYUIoJVbbnsssvKxosCSkPANgIaAAonvfKABpFAFdunl141cMT+sF80KtXjjwaHbTG83N13311OZ3ssu3r16nJeNU/a5BXE0Axte+2mdMkDjoOLB8tzjlJjmfUiwI1+NHrYTKmrzMG4oNtPRjcbpEugkbc5cgFBqMsz0jzllFOy5499Z38Jlqc05Svr9CmPkd98ZyxtvCL/dt9992IzhkYZpdulcWJ7fOOTtBkygr/5QHp6Pil3PxjdhNW9SRPBVvKZfamuS/kgCJ/S97xGsJntYcBW8xdTm+B+eqMyrj6kFzW+8Rj7zy9mPcM7sr3qvow7hrZwrH2Fcc9xcSN84YUXZpdJFSYo3/RMjbecSZmqzqCiLB599NHlPMzfdB5i/573vOeV8wmcV4e15UP8GE2YMdVt15lXfU1X9pW2mOlsk22n63DDRh7mvnk7tFLDq43BFvmPqvlRVS7t1ERE5AP5UV13SPUhl04XdTFdo6crZYEHkZhOGsccc8z8N5LJz3S9yN/q9FBdueX7pXzHlLLOjSzfOI151Iu99tprfpttysSk6loGJzFdyQfqF+1sTOfvnPk8pJqgfSfIlHtYroM0+5h88WDI9YJtpvdAwPyLL754QfCA/GV5viuavuH6m9/8pjjppJOy13vuT+Ke8YILLlhwfWSbbDsezuqOIcck93DQ98HpzjvvLI+ffc71sp3l+ehKLpjURZgzBN8wUavBQ/5nGFSCaBg4aZCM3jabz9UzAnHVABpDPDIUHetWA+9hCGGmkD7fASvn3Xxzuexfj+4RmZcLukUv2LqhIpuMLdQ1WNpXmMn0Col2qK5HcBjQLEMgEiOQ6bngeyxPEJhpVbMw/UZbXQ/HNEBfl0dDqSu5NLqq0/kdlbenvelNZV5QVimz6XzMU8yb1DhFUcZ46YBgPKZIzCPPCZZTfqsvJERPV9ZJe2yy/qrRM9d9/+qvyvlpfRlnPqE6g2uP97633A+C36XxmgTVCZATaGe99PuQobo0Q0xn/rQNnPTbyOQ37VRuuTDZUPqSR+wnijKRmuKIv5nG8m3qbZwT5lPWKHPVZYZSH3LptBXll7aDY2vqpRmKl2+q7fG48jOuXI+bP66exwsV1KuNR/cLsxiuNdSmHab+09uPZaij8a3ZPu1+tCto3HURTbvOjoPhPLnH63qfliO3/S4i757x9reXPVHn70PQqK3kevCI3Xcvz08M+x/qcp0Zqk4NrTblhutCjMCAUiO4a9vapi2PfGWZuro/lNoQvfR4jsx1SspBzAMDiGffXBw4B7Fs6kQu1h3PVDxHEDeqpln3/DEO1usSd2a/8BCIVV555ZXzXgHwDEislGMgzepzUt2zWS6+GT1PiV0Tiw1IM322rMZEYxvMZ7l0H9I8zL3U2zf/pxX3ZX5sM9cTuWm7456Dmc58lkuZVvwf4pxSl3KxEPwI5vO8zDnIvZBTFwufJK+CvrGDdYFlaboCFZOPIjOPgrvvvvuWPX8YWpWGiuncbLSFik1wnrRYlwJPxaQXGelVKykNJgWaZTG2Dj744HL77AdpsA4FMip9CgWeddLtsB6BYt5MyOVJm7yC6HVJ2gR8SZu3HtrQNQ+4SNBgsCzzWY7hG1mPaVyUCOpWqavMwbigGw045idp0HDUDY/XlGfV88cypBnnr7pv4/K1T3lkHd5USteJfaCxJUAYPVi6Nk6cSxp1LjKsj9gPjoEPpMc5Rhj9mAUprB/GLctwTjm3mHGRJoZcyiTnFVM70uWXnrbcmERZqg6P06Y+xEUNYc6Tt6RH+uRtbl/GHUNbONa+ot2g5yZlu+lbkSGMVgxXzB0M2JieMylThYmSM2fe+973lr0o+TYm+UQZ4SWRmI+hFIYfyzxldMNOWd9yyy3L9arDmIaGNl0RNxicX+axbfaBfdluu+3me+FxHUnXmYa6Gl6Tmq6Ilz3C1MP8wwRM1xtafcil00XkC/nDuX3c4x631neN0c6jh1gMd5blmkR+cO6p7/S23mCDDcplMHuYVzVXI3+r00N15ZbyTTmPckaPUpZhW0yjvWUYF+a1KROTqmsZnNR0ZXrkDdM55rr2Zig1EQ9dXNvrhu2pQppN9xtMYx7LVLfP/zy0cM1I74HiGlt9YzsM1LjOkW7cX1FOuGdgXvV6z3li+7Ee10fE34ceemh538i8umOoo+89HEzy4BSjW7BNRn2hXkY+zfJ8dCUXTOqiCG5HPeKbcem3xRCmTa6XEEZrBI7/21/8RbHh6Jq/xej41hvVXwKVGK6laZHpQUHwkXVYl20RtGM9DMjdRvexdQF3zBRMFdZ74CMfWa631ehBPQKfS8V0RQQo2ReU6xFMMPJJo/vpWGbbUX2LvKoLvhMETXuobPa8580fR/TKYTp5v9/ofjO2FQozBK3LpivHj+kS38pLVZaXud46lKfHHXZYmR+UWcogZfihO+5YpsH0asA9ytg2r3hF8bCddiqX22jXXcvzRZlkHnWGfUnXo74Q3GY+9YzlWY/1Hz9qg9ku81Kjapz5hOoMLsrXDqefXh4X86lnvCgR22QaQfEwKFONM80i4D5tAyft+YXY/6qJxf6nPQFTozT2E6V1Pg3ukxfpcab1lvN7zLXXzs9DaZtJGtXzPKT6kEunraINaRoSPRVtGmW6aqKMKz/jyvW4+WPb8VE7SnvKiwyU/7qXXqahajuc62m+z+jZlTxjmdTw6tPuh8HMdI6Vb75Wr7lLyXQl4E7g/bzzzsvGI7uQ234XpflC3j1kiy3KvIz2kWlPOeWUtdqcLteZoerU0KqWG17SqS5z6FVXzbeTfCc5fTGpa9tabct5Wa967UnXrav7Q6kNce/PC8xty2q8yJrrrVdHLtbNc0I8izGN2Cwx2ipNzx/j6BJ35viJBcb+7LLLLmVMNJ77mEZaqXkb1D2b5eKbHE+YwWyLUbtiG0cddVRx7rnnrrUOxDYuuuiiMhZYfS5lHi/13jxqG6v0zf9pxX0hRkrivLDfPJdifkLTdsc9BzOd+SyXgo8R61b3lf8j/s/fXYfaZh9Jj7RzsZAYvpr5dc/ZubIS9M2rYFyercssW9MVqLgMZ8dJDxOTikUAh0BR+mZIG2jkrrnmmuKVr3zlfMUnPRoDTKnqRYBKQ6A33T4NIxeMn40u/nWQDm+0xHoUXv7GPKjLkzZ5FRAIJj3S5TiovG3pmgc0ivQuooKzPZbHlKRBrdvPpsoM44JuEBfapuDquDzj/HFRO+yww1rt+7h87VMeWYd9iPxjPS5anAPyljwgnb6NE8fBfvJSQOwT2yEIedZZZ5UNJfuQg3P9zW9+s3jJS14yXxb45cJIua++vTTpeWX8eeoOdSj2k5uR3PkYd26B/Ma0jPPL8XMRYxz7un0ZdwxtIf2+IvDOTTD53LbXGMdRXafOpAyFiZIzZ6jrmEkYeSzDb3X4Xnq8vuc97ynzEeOV5eqGMQ3VmVdh/vQxXRHHXN0XjLZnP/vZ5Xdf0x6I01JXw6vOxMqpLu201zGadk/DPuTS6SLyhfyJY8wpNQy5jvICTJRdygEPK0yvM1frpofqym3o3/7t38o2NcxXjP+3ve1t5fmJtNuUiUkV22q7vah3LN/XdOW6SP7GPB7AuK5U1x9KTTCfNiD3zdQ6Yp266xLTmMcyue1j9HKN4t6BawfiwanuPpCH5He84x3lvQHLkl88KKYPYbnr/c9//vPyPixdjwde7hNYnml1x9BEn3s4mOTBiWPlHMWxYBxzfDDr89GFXDCpiwiUMfziw0b7HoYRIliGOYPhlDNlQgQj93r/+0tTMUxU0sFMPPLqq7PrlLr55tIUjPUI+vH3QVdeWZpTTQH3Y0b3oo8dlQ3WQ/TYi6BoBFHrDMWxwfoBRb6lQ03ydzkc7ejYGdp121NPLY+beVVzpy74jhiyD1OP6ay/9z//czmdoCa9FmMdjD16Esf54zd6J6O6PBpKXcml0VVp0LZO1XOPObnX6FqSlmHyDiPvgMsvX9gDaqS0jNFLdZvRtYblmUbZ5/9qz+8Q09PlCWSvPvfcsvzmjKpx5hNqNLhGZY3AOec9tkndfvR++2WPLTTONGM686dt4CDqBfWD7VHe2WaYVBgHm4+eb5mHqoH82E+04LyP8oVhWmMewyxTJ5mXmuOIl0meO7oPKXtsjdY7/CtfKc0Z5lHWKHOxvaHVh1w6bRWGM+YI7UlumaqiZ2e6zrjyM65cj5vfph2PHoMYSzGCwEw0KiMYn9G201YzTDblB9FeRxtFXUxfjunT7iOu07E92jDOSdQR2pbtX/va+TSnXWfHwf0dMSVe9ktfXO9DbvtdRI9h2gyGdo+2H/GCCqYpbSfns7pel+vMUHVqGqLsUQbZFteHZ43ugSkvXBd4WQDzmHmUraqZ36dtpe3kmpfOYxrbQ9STGPmj6Zo3hNrAy5hNHWmqEKPkvp7n0dw3PJtgXeJC6TMV8U3inU3+wbjnj3F0jTvzzJLGRYljEmPOxWCDumezuvgmbUSYp8wnPxhdkOl166Tb4NmNl4YjTszxxLNpHX3yf1pxX2A9zkvkAb/Eb6Bpu+Oeg+PZnOWqEHunB25T/L9POSNdPr3IdnOd7qIMM78uVlJ33qFvXgWTxA6WO1MzXUVEVipcJNXKUlfDKzWxckoN6Ka0McPpGc28afc07EMuHTUdTWK61inKU9NLAjzkbDEXGKVH8tlnnz0/b2g1wcsejBgSDwAiQ5ILJqmlIwycR++773w7lRMGD0Pvpes1Bd8JasawuLF+mHwE9Xc844wFAeQ6VXtwDq2u5NJQChGYx/zMleMQ5kk61DOqNQZGSr+ji6mQ1oc29Ral34+dhvqQS2clKkxXXgDKGWfTVJt2GJOLF5bSfevb7jPvmRdeOP9iRZPi+7HTUhsYzpPR0/hs1CTktq86qEW5oQw//a1vveelk2Tdvm1rm7YcMeR/vDgwDY2DFwJ4MQDTqcmsS4nhiDGY6jqPiCxH4jM8fc19WZpouoqIDEzVKFDrvhbLdKVnK0PCxHzeOptWT8M+5NJR09Fima4o3TYGbJuh0fuoCXrnN41+ITIJuWCSWlqiBwc9Sh65117zvUqiJzFB9+ilm6ox+D7SMd//fjkEbswnGJ8G7+llzLCI643a0rQHFL1H6Ol0yOc+V9vLcSh1JZeGUiHqCQZB2x7JqMkYQNFrGWESlD3R5+aVPa9G6fI9xnQUALbJd0LpwUY9TNMbWn3IpbPSRO9AeglOe4jWcaJ3Kj0mo/zQFtMmM+x3rhffpO0+ae40uu/F1Io6wjbpmc23OUmvap4NrTbE9+7pITdJb9fc9lV3Yd5v+6pXFX+z5ZbzZYvevk0jlkzSttKW84kJPhWRGr7UE6bxiYnoHTstjYMedfT26/JiAJ8K4ZMhXYYWFlkOxBDA1U/ryfJG01VEZGByZoFSy119yKWjVF/VEW89t/2GvUhXcsEkpZaCupJLQ6mVrD7k0llp4tuTDGOKgdM0PL4aXm1hKEeG7/zQhz601mfC2pLbvlJt1MQvfvGLYp999im/49mlxypmK8YUBpXIugLt8yWXXFIOwTvEt7hl6aDpKiIyMDmzQKnlrj7k0lGqr0QWi1wwSamloK7k0lBqJasPuXRWkuhFR29+enim3z1Vs1FbCNzz7f4dd9yx9+c3cttXqo3qYCjhk08+uTj00EOLm2++eW6qyLrNJz7xifLTYNVvy/KdXl6M4QUZRq370Y9+NDdH1gU0XUVEBiZnFii13NWHXDpK9ZXIYpELJim1FNSVXBpKrWT1IZfOStDu73lPsf4228wP5bvNK14x9aF01dqaJbntK9VGInIvDKdNT9ZVq1aVvbz333//Yr/99ivNVqbzLVc+/yTrFpquIiIDkzMLlFru6kMuHaX6SmSxyAWTlFoK6kouDaVWsvqQS2claNd/+IfSbH3AxhsXO599dvZb2Wr6miW57SvVRiJyL/Twvuyyy4ojjzxy3mjlm8YHHnhgcfHFFxe33nrr3JKyLqHpKiIyMDmzQKnlrj7k0lGqr0QWi1wwSamloK7k0lBqJasPuXSUmpVmSW77SrWRiMhKR9NVRGRgcmaBUstdfcilo1RfiSwWuWCSUktBXcmlodRKVh9y6Sg1K82S3PaVaiMRkZWOpquIyMDccMMNWcNAqeUqynQfrAtqKPUtgyJD8LJbbskGlJRaTFEuu2JZVupe9alDYD1Si6W+ZbYvlnXVR7MupyIiSxFNVxGRgVmzZk3WNFBquYoy3QfrghpKfcugyBCcfuut2aCSUospymVXLMtK3as+dQisR2qx1LfM9sWyrvpo1uVURGQpoukqIjIwN910U9Y0UGq5ijLdB+uCGkp9y6DIEFx0++3ZoJJSiynKZVcsy0rdqz51CKxHarHUt8z2xbKu+mjW5VREZCmi6SoiMjB33HFH1jRQarmKMt0H64IaSn3LoMgQfPOuu7JBJaUWU5TLrliWlbpXfeoQWI/UYqlvme2LZV310azLqYjIUkTTVURkCtx4441Z40Cp5SbK8iRYF9SkmrQMigzBW267LRtYUmoxRHnsi2VZqcnqEFiP1Kw1aZnti2VdddFilVMRkaWGpquIyBS48847s+aBUstNlOVJsC6oSTVpGRQZguv++MdscEmpxRDlsS+WZaUmq0NgPVKz1qRlti+WddVFi1VORUSWGpquIiJT4vbbb88aCEotF1GGh8C6oPpqqDIoMgRfd5g9tQREOZwUy7JayRqiDoH1SM1KQ5XZvljWVRstdjkVEVlKaLqKiEwRemg5vKpabqLMDt270LqgumgaZVBkCHiD36H21GKIcjdkDxLLslppGroOgfVITVPTKLN9sayrOi2lcioislTQdBURmQF33HFHcdNNNxVr1qwpbrjhhqzJoNRiiTJJ2aSMUlaniXVB5TTLMigyBN+8667iottvL06/9dbiZbfckg1CKTWJKFeUL8oZ5W1aWJbVuqpZ1SGwHqkhNMsy2xfLuloO5VREZLHRdBURERERERERERERERERmQBNVxERERERERERERERERGRCdB0FRERERERERERERERERGZAE1XEREREREREREREREREZEJ0HQVEREREREREREREREREZkATVcRERERERERERERERERkQnQdBURERERERERERERERERmQBNVxERERERERERERERERGRCZi96fqDq4ri8nOK4oJji+LtBxXF256rVL0oI5QVygxlR2RIbI/UuiLbShEREREREREREZFFZXam60++WxT/+Ip8sFiptqIMUZZEJsH2SK3rsq0UERERERERERERmSmzMV2v/Vw+KKxUX1GmRPpge6RWkmwrRURERERERERERGbC9E1XetrkAsFKTSp7cUlXbI/USpRtpYiIiIiIiIiIiMjUmb7p6hCealqibIl0wfZIrUTZVoqIiIiIiIiIiIhMnemarj+4Kh8AVmooUcZE2mB7pFaybCtFREREREREREREpsp0TdfLz8kHf5UaSpQxkTbYHqmVLNtKERERERERERERkakyXdP1gmPzwV+lhhJlTKQNtkdqJcu2UkRERERERERERGSqTNd0fftB+eCvUkOJMibSBtsjtZJlWykiIiIiIiIiIiIyVaZruuYCv0oNLZE25MqOUitJIiIiIiIiIiIiIjI1NF3V8pdIG3JlR6mVJBERERERERERERGZGpquavlLpA25sqPUSpKIiIiIiIiIiIiITA1NV7X8JdKGXNlRaiVJRERERERERERERKaGpqta/hJpQ67sKLWSJCIiIiIiIiIiIiJTQ9NVLX+JtCFXdpRaSRIRERERERERERGRqaHpqpa/RNqQKztKrSSJiIiIiIiIiIiIyNTQdFXLXyJtyJUdpVaSRERERERERERERGRqaLqq5S+RNuTKjlIrSSIiIiIiIiIiIiIyNTRd1fKXSBtyZUeplSQRERERERERERERmRqarjPWq3ZZVdznPvcpPn/cztn5qoeWAR/+8IeL9ddfv/xdatx6663FAQccUIq/Z83Mtp8rO0tQFx34xLKN4Dc3X6neWubccsstxZlnnllsvfXWxSabbFKcd955c3PuYdz8pcIPf/jD4mlPe1rxspe9rPj9738/N7V+uoiIiIiIiIiIiCwPlrzpijmJAYFZmZu/3KTpOgXNCAL6Rx11VLF69eriuuuum5vajnXRdP3Tn/5Umhqbb755cemll85N7c5yMl2//4rdi0c/+C+Lw7Z+eHHnm/fPLjOpNF3V1NTAj3/842KPPfYoDj/88OKmm26am7p0uPnmm4tDDz20NFP33HPPYv/99y/e9a53zc2tnz9Ju50yZP5ouoqIiIiIiIiIiKybaLrOWJquU9CMaAreYxaef/75tT2rNF3r0XRdKE1XNTU1sNRN13e/+91lG3rJJZcU//mf/zk39V7q5mu6DsOaNWuKt7zlLcVHP/rRuSkiIiIiIiIiIiJSRdN1xtJ0nYKWAF/72tfKgD9B6Rzrouk6FJquC6XpqqamZQoGJEbkjjvuWFx//fVzU+9l3PylxnI0XZfyNUxERERERERERGSpoOk6Y2m6TkFLAE3X/mi6LpSmq5qalilhqmJIYkxWGTd/qaHpKiIiIiIiIiIism6i6TpjabpOQUsATdf+aLoulKarmpqWKZqui4+mq4iIiIiIiIiIyHiWtel619n7F5cesk2x48YPLv77f/2/yuWe9NAHFW951hYLDJHUxGD6m/fYvPjbv/yzYudNHlLcesa+5TJ3v/XA4jsv27V4+Y6PLlY95P7l8qS566P/prjymB3L+ZFeqv9863OLq09aXRy85cPKNFlv8/X+R/H2vf538ds3PWet5TVdp6Aa+OboG97whjJQ/LnPfW5u6r3cfvvtxQte8ILaQP0nPvGJBUHmnDkYgeic0sB5GrD+wx/+UFx++eXFvvvuW07beuutizPPPLP89mAbpn1cN954Y3HaaaeV+8Vy7OfnP//54u677y6XT8FkZhlM5xykd+GFFxZ77bVXudwmm2xSHHjggcXHP/7x8jhimb7b70Su7HRUX9P1R696VnHsto8oHv7APy/rP7+vW71p8avX773Wsml7RbtD+0M7RHv0l/f9L8Xem21QfP2lzyjbnuq6TGNbr991s7ItJB207cP/umwraTOr66RtEm0WbRdtGNP4fcfo/6Zj/fUb9inO2XOLBdvjb6YxL7fOpNtUPdVAk+EXbRZ1lzpMvaROX3DBBWstO45qmxBpMY15KdE2xHKp2NdvfvObjfM5pkgj2pcc1X3KtVNN+cP/n/3sZ4vjjz9+vt3il3aM9qxKXVrV6Xyblu9mk9773ve+uaXW5tprry222Wab4tRTTy3P1Ti67G+08TnVvWQUxH4de+yxxW9/+9u5qfcS16Jzzjlnre/0xnWM8xDnjWXYv3e+850Lyg/XCMpn7tjTa9RvfvOb4owzzihWrVpVnHzyycVdd901t5SIiIiIiIiIiMgwLFvTlUD9C5749+U8TFJMkL02Xb80M5660YMXBPvDxLjgOU8oTl+9Wfk3SpeL7WBqbPOwvy6OfvLG82YuuuSgJ8+nF8LgYDrrYLju+dj1y/0I03b1o/6muOn0vRasM0vTNY4bVfMvp//vrP2K8/bdaoGJzbFgFl1z8m5ZkyfEPJbBtN5i/XvME0S+PGOUD5990dOy6w2iBpqCuhEQZj7LpYSxyXyWg1zw/oorrij233//Yvfddy/T2Xbbbcv/0VlnnTUf1A3T9f3vf38ZBCbATcA7DXoffvjhrY3XaR0X5uZuu+1WBrQJ4KcmxGWXXVYun9Jkun75y18u84P5u+yyS2kkHHnkkeXxpmbDJNvvRK7sdFQf0/UzL9qpbJdoJ3bZ5CFl2xJ1BIORepMun7ZXb9hts+IB//2/lnXyhO0eOW9sUj/fd+CT1qqTsX/Mf8KGDyz381mPXa/cNuuR3p/OWfgCSbRJHz5s2+KALTYs97W63iue9pji/5xzwIL1UBwby9BW0CYfuMVD56dttcEDyn2qrjfJNofWLNtJtOa0PUtTHCM81ueYuR69/+C1rzODqoE6I/B3v/tdaVCl9fjoo48u63baFrah2iaQ7gknnDA/bY899ij3I7jtttuKl770pcV+++1Xthu0A3vuuWfZvtKWfPe7322cv2bNmmy7ndK2nWoyXaMdJJ3DDjusbLtIi2m0Zz/60Y/mlryHtqYrjDMu4d3vfne5rWp7X0eX/cVYJz9jPr9xjWNeE00vAKUvD7EMy6bEcbNM1fiO80w+HXHEEaWJSjrvete75pcN4lg/85nPzJdjlDuPIiIiIiIiIiIik7JsTdcIlL/2GZsu6L1FkP5rL3lGcccb91trWcyOPVatV3zv5WsHxlnnvQfc0xM2nf7pF+5UGocE2G+u9EqLeYds9bAFPdbYH4LyBNTZv9TkCLNhqZmuVx2/c2nWxPJVcSwYBWleh8iz057+2HkDISf2pbreYGrgpz/9aRnIzwWsMUAJ3m622WYLArtAcJ4eNmkwuCl433Z4YczZk046aYG5+otf/KI49NBDy/kf+9jH5qY2M43jwmQgzSuvvHK+Vym/H/rQh8r0MIUxQVLqTFcC5ttvv30Z1E/TA0wczOowpCfZfidyZaejupqumHAYq/Sq/+Gpe8xPpwfrvz5/u7L9qKYV9RZjFpM2XY9265NH71iut9GD7ld8d9SWxTx03SufWbxr7y1LYzCdHvvBvldN0GiTttzgAcUrd161YF/o/c96f/3n/0/ZRqbrRZoYphxLOhpA2gbu9ui/XatHb99tTkOzaie5NmGkh6mc07jtT6wG6ozAaLve/va3L+hJSLvyne98p6zPbbjuuutKQy/XJpButFu5l0/YH/YrZ95B0/ymdrtLO1WXP/BP//RPxbe//e0F65M/73jHO8q8q74cU5dWbjr7gTGdviiTEsYmxvMvf/nLuanNdN1fiHIQIyS0JQzh6qgM7Cv7vPnmm2ePLbaXGsk//vGPi4svvri444475qbcQ5St3PmPa9TrX//64rjjjiuvtyIiIiIiIiIiItNi2ZquEbRvY15GUB2T4lsn7Zpdpk6/e9Nziudt+bDioQ/4fxesS09benTRK/anr3n2gnXQbWfuW+z7uL8rnvzQBxU/e+2987vs96RqayawL5g4LMdvmM+YKF99ydOLHTZ68Hw61Z5yaY9jxLL0fvvD2ff0UCMfMGT+5bBt59cZXA3UBeNj+oknnlgGtA866KAFhl70smFoxwg+NwXv25qumIq54SYxW5lfNUnrmMZxsf3zzz9/rWA762OE5ALjOdMVA4WeUxgoDGE5jkm234lc2emoLqYr9eTknR5T2+5gwr14+0eu1bZEvWU71V6wCOP13H22Kpd54zMfv9b8nFjnlKc9plzniqOeumBetEn7b77hWmYt6521++PL+e/ce8v56XFsmIz0Vk3XCXF8Jz31UeW6HzjkKQvm9dnmtDSLdpK8SEdZ4Nxedvh2ZfvJfNKh3Xz3flvPrzMVNVBnBNa9WNEF2rQ3vvGNZZuAkZmDZRj6lW1VXz6pa++Cpvl17XbXdqouf5q4/vrrix133HGtl2Pq0qqbHteP3BDDV199dWlc5ozSrtTtL/Q1XSk35HF1/5jOizaYssz/yEc+MjfnnrLAtRAj9Sc/+cnc1HpI981vfnO5f1VzN8rvPvvso+EqIiIiIiIiIiJTZ9marpgNMf2uTK+iVBFUb9s7raowCFKjFJMEs4QenpgE6fIh1qv21sqlNS21MRP4pi1DerIMBkpuyFKMn+jdVe1dx/DK0cM1N5zyTDQGAtUEXdMeM9FTlAAy86uGHtMJBKdGQ13wHliObYwzXetM1Qh2dwnoD31cdaZmGtBO14OcIRPGAaZvm15wk2y/E7my01FdTFdetuCli6Zlo46mLyXEtBOf+qgFxl2qa0f78cj/+RflCyG8GJJbpqpIl990erRJdQYnZiDz0zYkji03AkAq2jnah+qx9NnmtDSLdjI1bOnFmzPTZ6IG6gy/6KlIXc99M7MNN910U7H33nsv+D5nDuo37VO1nWR/2C/2j/2s0jS/rt3u2k7V5U8T47ZdTatuOsYjBmTVDKVt5AUaTFfM10mp21+Iaxi/XYhzXx1CmHJFeaDNZ356ztk287rkdd3+xTVqCFNaRERERERERERkHMvWdP3xac8qg/7M41t4//aC7ccaG+MC+PRYIt0PHvqU4jXP2LT8Rmz6fdLUKMUkienjlK4XZkM6bVpqYyawH2GaMgwo5kJ1GcwSTJNIK3rXsSzrMI00Pn7kDmutOxONgSEwCUqnQV16wzCs5H/8x3/Mz49g7R//+MfitNNOKwPBBIyDpoA0ZkEYEzkiIPyBD3xgbspC+gT0hz4uhnqs+6ZszlyF3HT2gWkE1dswyfY7kSs7HdXFdOVlC166iHrTpNQIjXrb1MuTb1HT7lW/X40wA3/xur2Ky4/YoThjt8eVPfL5vmvU83RbKNokjM50eijXBsexvegpj5jv1Z4Twx1v+jf3X8sc7rPNaWna7eRdZ+9fDm0f0+mlXPeiztTVQF0bxIsctBnUP+rppz71qdZtVBBtEe0P7VAdDB/79Kc/vfxO65133jk3dTqma9d2alwbzXF973vfK4dJPvPMM8tRBhi2OPIt3XZdWnXTad9p58lD8jIgTczJtsZxSpf9hTpTcxxx3UlfqsE4xkCm9zPHyfzUkI/ykuvZi3H6q1/9qvj0pz9dnHvuueWx831XzPrc/sW1o+t+i4iIiIiIiIiI9GHZmq6I7wQyfGV8I4+eRAS6Y8jGUATVq2ZDqm+euLr8fmIExkmToYMZOvdpj/hf5TT2JZaPNFc95P7lsJJNWso9XaPHMGL40TozIE0rDKfo7cu06jDKM9UY4pt3MdRuBLCj11AErsMQqP4fMD0XvIe2pmtd4HdcQD/HLI4r6GK6jjvWKpNsvxO5stNRXUzXaLv45mmuXUiVDtHbpr2qM11/8uo9yyF7o65iFGK4Yrzu9/i/y6Y7rk3KtcG5aTnV7WefbU5L024no1cw06pDSc9cDTS1QbwMwdC/q1atKuthDAvb1ugb1z4GdW0B+8N+sX/sZ5Wm+XVpdm2nmgzRyy67bN6wRPxNu/zqV7+6fAmmuu26tJrOwRe+8IXSWExNYvKVaRinbemzv9A1v1IYjYF1YwhhzFdM2BgKmDRTQ7n6f/Dzn/+8/C5r7DfHjuGK8fqiF70ou3+DXDtERERERERERERasqxN19AvT9+7OGfPLcrhNlkWozQ1XseZGHyTFYMVc4Tv9PEd0nR+ziD4x4OeXE7r+s3BcWbDkGpjJsT+jDuWGO4T7bzJQ8qeXnFu0HMe/3fF7ZVvM85MY6BnDEMLRk8bgsmYjxG8DrMyelpGL5tq8LYueA/jTAXSygWEg6Zgex2zOK6gLnCdm05gnWm5Xko5Jtl+J3Jlp6O6mK5fPH6X0vRsGiY4p3HtFaJH/pYbPKDYY9V68+0V30bFcOWFEUxCTM7UHKxLd1yblGuD2x5b9HSt5lefbU5L024no8wwbVFfTkENtGmDfv3rXxcXXnhhORQ69fHkk09uZbx+4xvfyA4bXCV6ulb3gb+Zxv6xn1Wa5te1L13bqbr84XuwHNvBBx9cDvHb5oWWurSazkF82zqG6SUf6Sna9runQZ/9hXHXsCbiuOL8kwbD4NOLGsKEZSQI9qfa8xXuuOOO0nDF+Ocax7x0uOC6/dN0FRERERERERGRWbJOmK6hW96wT9mji+WvOOqp89PHmRgxVHAumJ4OGZkaBGE6jBtes6pxZsOQGtJMiPOAwuhJpy1l0xViKEkCspiP9OxJe9HQEyd61hCEjyF6U5oC0othusK0jyvoYrqGwXLqqae2+gbkJNvvRK7sdFQX0zUMx9QYbaOot009Kql7VdMzhvytM0Kp36RbbQfHtUlRz9M2JEzfuqF2Q7n9RH22OS1Nu51cl0zX4De/+U3Zu5A6Gb0Vm4hvTWMaYh7WQf3OmbPsD/vF/rGfVZrm17UvXdupXP6EQZgOnZsS3zOtbrsur5vOAQZjfL+V9vyXv/xl+ULNOCM7pe/+wrhrWBMxnDBGKttgH9IRF2LUBqbdeOON5T5gKKfHxTFz7HXHy/Utt3+ariIiIiIiIiIiMkvWKdMVRQA9NRZy01I1zY9esMxPDYKfv/bZxXZ//z+LjR50v07DRY4zG4ZUHBeqy7/XPmPT+WXaDptJT+Lfv3n/BQYDecFwz7l1p64WRNCfoO473vGOtXrRRLD7Pe95T7lMDNGbUhe8BwK6BHbf/OY3L+h9E4wLWDcF25uY9nEFXUzX6JHFEKTf/va356bWM8n2O5ErOx3VxXSltz0vgWA6dvnecdQ12h3an+r8/3POAeWw6izDCyMxvamtjF6wzK+2c+PapFy6d819p5RjS4dGThX7yTL/fvSOC+b12ea0NO12MjVdGY3h2tH/uXVnoga6tkFdTDhMTcxNTM4rrrhibupCMNIYwphlGEo3hf1hv9g/9rNK0/y69qVrO5XLn3H7Fb1Kq9uuy+u66UH0CKWnJ2Z3Lq+a6Lu/EOe77rvk42CfMU0/+tGPltestNzEqA2YrZQPlqua+XGN5VpQJXrB5sqjpquIiIiIiIiIiMySZWm60rP0C6PpGAnpspgcBLrp7fXlE3aZnx6B8KrZEIqers/b8mELemvSc/bQrR9ePOC//9dyfmoQEHQ/d5+tyukMI/nDU/eYn4cwHOhtm5oiaJzZMKTamAlx7Kiu11ra2xedt+9W5fTo7ca0nLEyM7UgevgwFCPGZLUXTfTEOeyww8plYojelLrgPVx//fXlkJt1PbnGGRTjgu11TPu4gi6mK/DNQIL3BNcxNFIjmgA5gfW77rqr/H+S7XciV3Y6qovpijBbqRubr/c/iq+8+OkLzLq733pg8dWXPL14935bL1gn6i3t2CFbPaxsh2LeXWfvX9Y/0nzWY9dbUF+jpyvt0Y2v2XN+Ovv5yp1XlfNIt9oOjmuT6gxQ9p3vaDMs+78+f7vyeGJeup9HPmmjtfKq7zanoWm3k/R2pddrdfqiqIFcG0T78vWvf72ssykMKczQwphjDFHbBtoBDE5641955ZXF3XffPTfnHlOW75LSZpxyyilrtYHjzMKm+U3tS5d2qi5/aH9pmy699NIFx0TPTNLNmZh17X3d9IB8p4fxUUcdVZx00kljew5X6bu/8OUvf7lcr23P4CrRU5XrUW7EBUxW5mOesh8x9HAQ6/Pt2V/84hdzU+8597zsxDz2b0jTFZN7l112KQ3hPscsIiIiIiIiIiIrj2VpuhLAx/QgoP+EDR9YGq30KCP4z7Knr96sND1j+QiqV82GED00CaSzDGmQ9p6PXb80FF64zSOKE7Z7ZDmvahBg8h6zzcblPPZl24f/dbnsMx71N+W6TOfbr+k648yGIdXGTIgeu3EMuV5r15y823xPLcyjG151j8F819n7F8dtu8n8Nhhi+DcdhlEdTC0J4xPlhsTEkGQeQedcgLYpeB/BcNYnSEvQ/KyzzpoPnE/LdIVpHlfQ1XTF+OXbj2yT+bvvvnt5bEceeWRpvKTHOcn2O5ErOx0Vpiv1m3qzw0YPXksv3/HRZQ9HlqcdesNum5V1izqyxfr/ozh220cUe226/nx7RS/KdBtRb2nHVs+1JbRHtEurHnL/ct5WGzyg3Jd0PdpFDE7ms84BW2w43y4+e7S9M3Z7XDmv2g6Oa5PqDFAM5A8c8pT5to59q7bFtAm5HvB9tzkNTbudJJ/evMfm89ugB/Oa0+41xWeqBnJtEL/8Tz3ec889S6OVdg7jlPpI7/rcUK85MDQ/9rGPlfWfdWknq+lhyPH96SqxH+wf+1mlaX5T+9Klnapro2mT4pj22muv0pTcd999SxOQtHPbrkurbnoKecj+brbZZuVww7mRFZros78QwxnHeuxj7iWeOkiPF4PiPFdHXIhRG5ifO37+x5BnPvt//PHHz5cdTOhzzz23nDek6frOd76zXJcXltasWTM3VUREREREREREpJ5labrSo+iTR+9YmgoR8A+T4dMv3GlBjysUQfWq2ZAKY+B1qzedNwsIml/83CeVxmKTQYCp8rEjdyh7nf3lff9LuRxp0Gv2quN3XmtfxpkNQ6qNmYDIs8hH9v2yw7crexNHTzyMJOZhNrzvwCct6K2H0UBexXb23myD4tsv23Xe9KZH2AcPfcpaPX4HVUtiaMZcLxogKEswmyEO+e5clabgPfzqV78qXv7ylxerVq0qRe8behbBNE3XaR8XdDVdATPgmmuuKV75ylfOB/kJkL/61a8urrvuunmzYJLtdyJXdjoqHSq2TtVesNSXL52wS3HwqE1I2yuM1MuP2KFsY9JtpO0VvVzTdgljk//rhvLmRZC37/W/5+sk62H4Mb2uHRzXJo0zQDEQT3v6Y+cNYdpB2sPcsYUm3eaQmkU7edPpe5UGemyHZT/zop3mvwfO+WGkgGqv58HVQK4NwpS86qqrSoMr6nAYXl/60pcW9JRsy89+9rOy5yCmK+nRVh5xxBHFpz/96drehOwP+8X+sZ9VmuaPa1/atlN1bXSsjwHIsdDWcjz0zKzbdl1addNTfvKTn5QmYK63aBv67G/AiA4syzrk1cUXXzw3ZzyUJb7HSv7mzNo4h8zn+6w5eLnpoosuKo8/ztP5559fTq+7xk5y7WCdHXbYwZ6uIiIiIiIiIiLSmiVvuqr+Ss2EnMIcwhzAGA1jJyeMlAue84QFPYhDX3/pM8qed7n1QlWjZ1CJtCFXdtSK16zaSYZjjxEV6jR1k1mWPWG6NhmzIiIiIiIiIiIisjhouq7DamsmxPL0njtz98cVT3rog+aXYThUerGNGw6TnlqXHPTkBT1+Y/2jn7xx2SM2t94gEmlDruyoFa9ZtpN3nb1/+a3vdJQGRC9hhmWe+ggIsuzh27f03GSYYREREREREREREVlaaLqq5S+RNuTKjlIrSbKsue2224rDDz+8/LYq31gVERERERERERGRpYWmq1r+EmlDruwotZIkyxa+n3vppZeWvVwvueSS+W/NioiIiIiIiIiIyNJB01Utf4m0IVd2lFpJkmXHt771rbJn6+67714arieffHLxu9/9bm6uiIiIiIiIiIiILCU0XdXyl0gbcmVHqZUkWXZ84xvfKDbZZJNi6623Lt75zncWv/3tb+fmiIiIiIiIiIiIyFJD01Utf4m0IVd2lFpJEhEREREREREREZGpoemqlr9E2pArO0qtJImIiIiIiIiIiIjI1Jiu6fr2g/KBX6WGEmVMpA22R2oly7ZSREREREREREREZKpM13S94Nh88FepoUQZE2mD7ZFaybKtFBEREREREREREZkq0zVdLz8nH/xVaihRxkTaYHukVrJsK0VERERERERERESmynRN1x9clQ/+KjWUKGMibbA9UitZtpUiIiIiIiIiIiIiU2W6piv84yvyAWClJhVlS6QLtkdqJcq2UkRERERERERERGTqTN90/cl380FgpSYVZUukC7ZHaiXKtlJERERERERERERk6kzfdIVrP5cPBCvVV5QpkT7YHqmVJNtKERERERERERERkZkwG9MV6Gnj0J5qUlGG7LUlk2J7pNZ12VaKiIiIiIiIiIiIzJTZma7BD64qisvPKYoLji2Ktx+UDxYrFaKMUFYoM5QdkSGxPVLrimwrRURERERERERERBaV2ZuuIiIiIiIiIiIiIiIiIiLrEJquIiIiIiIiIiIiIiIiIiIToOkqIiIiIiIiIiIiIiIiIjIBmq4iIiIiIiIiIiIiIiIiIhOg6SoiIiIiIiIiIiIiIiIiMgGariIiIiIiIiIiIiIiIiIiE6DpKiIiIiIiIiIiIiIiIiIyAZquIiIiIiIiIiIiIiIiIiIToOkqIiIiIiIiIiIiIiIiIjIBmq4iIiIiIiIiIiIiIiIiIhOg6SoiIiIiIiIiIiIiIiIiMgGariIiIiIiIiIiIiIiIiIivSmK/x+av2onx51TAQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc = [nlp(text) for text, annotation in [test_data[random.randint(0, len(test_data))]]][0]\n",
    "spacy.displacy.render(doc, style='ent')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAB1UAAABJCAYAAABl2n85AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAADXDSURBVHhe7Z15tGZFdej9561kZdLo0zg8NSSKElEfgkIQQ5DBViEMIjY2MgbaCBJAFGmbIA0ICKjYikDUwBJxwigaHooRIRKCAyhIGJwQEURQUeLQJup5/Tvcfal7uuqc85373Xs/bv9+a+313XuGOlV16lTt2ruGh1QiIiIiIiIiIiIiIiIiIlJEp6qIiIiIiIiIiIiIiIiISAs6VUVEREREREREREREREREWtCpKiIiIiIiIiIiIiIiIiLSgk5VEREREREREREREREREZEWdKqKiIiIiIiIiIiIiIiIiLSgU1VEREREREREREREREREpAWdqiIiIiIiIiIiIiIiIiIiLehUlfFxy1VVdcnqqjr3iKo6c/+qeud+ijL3QlmjzFH2KIMiIiKLBXUrRZm9qCuKiIiIiIjImNCpKrPnuzdU1Qf/IW/EUJT5FsoiZVJEROTBirqVosydqCuKiIiIiIjIQHSqyuy46fN5Y4WiLLRQNkVERB5sqFspyvyIuqKIiIiIiIiMiE5VGQ4jvHMGCkWZFHEWgoiIPJhQt1KU+RV1RRERERERERkBnaoyHJelUyZdKKMiIiIPFtStFGV+RV1RRERERERERkCnqgzjlqvyhglFmTShrIqIiEw66laKsjCirigiIiIiIiI90akqw7hkdd4ooSiTJpRVERGRSUfdSlEWRtQVRUREREREpCc6VWUY5x6RN0ooyqQJZVVERGTSUbdSlIURdUURERERERHpiU5VGcaZ++eNEooyaUJZFRERmXTUrRRlYURdUURERERERHqiU1WGkTNIKMqkioiIyKSTa78URZkfEREREREREemBTlUZRs4YoSiTKiIiIpNOrv1SFGV+RERERERERKQHOlVlGDljhKJMqoiIiEw6ufZLUZT5EREREREREZEe6FSVYeSMEYoyqSIiIjLp5NovRVHmR0RERERERER6oFNVhpEzRijKpIqIiMikk2u/FEWZHxERERERERHpgU5VGUbOGKEokyoiIiKTTq79UhRlfkRERERERESkBzpVZRg5Y4SiTKqIiIhMOrn2S1GU+RERERERERGRHuhUlWHkjBGKMqkiIiIy6eTaL0VR5kdEREREREREeqBTVYaRM0YoyqSKiIjIpJNrvxRFmR8RERERERER6YFOVRlGzhihKJMqIiIik06u/VIUZX5EREREREREpAc6VWUYOWPEBMsP3/zy6gUbPa4W/s5dMwkS8Xzm4x5e3fwPu2WvUQaILAi//OUvqze84Q3VBhtsUH35y1+eOtqfH/3oR9Vpp51WbbXVVtXGG29cvfvd7546I/PJxz/+8fod8itV9eMf/7jaZ599qhe96EXVt771ramjImMg134p8ybn7/tX1UMe8pD6N3d+UiTiuWrHTbLnlYEiC85vfvOb6sorr6yWLVtW6x177LFHddttt02dlUnk5z//efXe97632nbbbet39qY3valas2bN1FkRERERkcVJp1MVgyGGw7e//e3Z//sQ92Bcx8i+ENx5553VoYce2mnYx1h63nnnVbvuumvdMcCYf/zxx1e333771BUPQFhc00dKaSdvCJ/ncN3SpUurCy+8cMHyqTc5Y8SIcuVrXlwbhZryxIf/QbXPFk+qLj/shdVv3rFv9t5RRafqei6LlF//+te1o3HzzTev641JYzZO1Xvuuac66KCDamcqRrW99967Ovvss6fOynwyLqfqpJfXvuhUXbxcfPHFdfl817veVf33f//31NF5JNd+DZDfvmO/6sZjdq1WLnlmtcUGj5zWr57yJw+t/nbLDasvvm6n7H2zlQ8fsE31mIf+XnXSzptWvzpjn+w1kyw6VddzkQXlt7/9bXXRRRfVeh8OOvS+V77yldWtt946dcVofPe7353uz3fpoP/1X/9VnX/++XU/nOuR3XbbrfrYxz42dcVM0G8/8YlPTDt/6cevWLFikE4wNKy77rqrWr169bQzc8cdd6x1rPvuu2/qinVBD7viiiuq5cuX1/m8ySab1PaRa665ps7/UcGheswxx0znF+/spJNOmnw7hoiIiIjILFn0TtVf/epXdQctOhxtnSriufvuu8/oGPDL/9z/hS98YerK+/na175WX9Mm8VxGcKadFf7+3Oc+V3ec6NC8/OUvn3E9HRQ6KhNLzhgxooRTFSPfDhs9rpbnPelPqj/83f81bQD8+23+ovrZW1+RvX8U0am6nssiZTE7Vd/znvfU933gAx8YZOiR8aFTdSY6Vecfys6XvvSl6thjjx1sYO/DYnCqrjlj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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc = [nlp(text) for text, annotation in [test_data[random.randint(0, len(test_data))]]][0]\n",
    "spacy.displacy.render(doc, style='ent')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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UjL6KYqyXWRtKJW9omw2GUvpHsrWFRGRjcSHPvSh1qbGJzR46xx2PmxtOFI5zqc2eGW6iIhsHnSoKlteNgPs/Lzkkkua448/fpUTdZdddmmOPPLIdoLFbtG14hvf+Eaz0047tZO8k046qfnVr361fEZERKZQMvopirJdZG0olb2ibDYZS+keytYVEZGNBBsTzjrrrOaAAw5YcaJia3vqU5/anH766e3mChER2VzoUFW2vIiIiKw3JaOfoijbRdaGUtkrymaTsZTuoWxdERERERFZJDpUlS0vIiIi603J6KcoynaRtaFU9oqy2WQspXsoW1dERERERBbJZIfqS6+7rui8UpSNJOipiIjIenPppZcWDX+KsqMLbUPWBvshZbPLlP5Cvd9xxPFERERERBbNZIfqK6+/vujAUpSNJOipiIjIerNt27ai8U9RdnShbcjaYD+kbHaZ0l+o9zuOOJ6IiIiIyKKZ7FA97YYbig4sRdlIgp6KiIisN1dffXXR+KcoO7rQNmRtsB9SNrtM6S/U+x1HHE9EREREZNFMdqh+8+abiw4sRdlIgp6KiIisNzfeeGPR+KcoO7rQNmRtsB9SNrtM6S/U+x1HHE9EREREZNFMdqjCa3/5y6ITS1E2gqCfIiIiG4UrrriiaABUlB1VaBOyttgPKZtVZukv1PutL44nIiIiIrIWzORQveSWW4qOLEXZCIJ+ioiIbBRuuummohFQUXZUoU3I2mI/pGxWmaW/UO+3vjieiIiIiMhaMJNDFb7uq3+VDSjopYiIyEbjhhtuKBoCFWVHE9qCrA/2Q8pmk3n0F+r91hXHExERERFZK2Z2qAI7AX39r7IRBD10Z6qIiGxk2EXh6weVHVXQfXcSrT/2Q8pmkHn3F+r91hLHExERERFZa+biUA2+efPNzWk33NC88vrrm5ded13R4aUo8xT0DH1D79A/ERGRzcKNN97YXH311c22bduaSy+9tGgsVJTNLug2Oo6uo/OysbAfUjaSrFV/od5vTnE8EREREZH1Zq4OVRERERERERERERERERGRrYQOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQq6FAVEREREREREREREREREamgQ1VEREREREREREREREREpIIOVRERERERERERERERERGRCjpURUREREREREREREREREQqDHKo/uhHP2oe+chHNi996Uub3/zmN8tHRWQM119/ffOUpzylFX6LbEZe+9rXNre//e2br33ta8tHNgbXXXddc9xxxzX3v//9m5122ql5y1vesnxm4/ChD32oLTvKUEREREREREREREQ2DzM5VC+//PJm9913b5797Gc3V1999fJRGcNmKcP1TOeNN97YnHXWWc0BBxzQOktwSNzjHvdonvGMZzSnn376pnFO6lCVrcBGdKhee+21zT777NM6UvfYY49m7733bk4++eTlsxsHHaoiIiIiIiIiIiIimxMdqgvmt7/9bXPOOec0RxxxRNGJpkO1zu9///vm4x//eLPLLru0TgiE3zhL8mNcx/Wz8rvf/a756le/2tbXZZddtnx0PuhQ3Tr0teutzEZ0qL71rW9t03TGGWc0f/jDH5aPbjzm7VDdtm1be6+Pfexjy0d2TBbZb4uIiIiIiIiIiIiAr/xdMDrRpoGB/O1vf3u744zdqOw2+/nPf758dju//OUvW0cK57nuwx/+8MzOFPQbPUff0ft5oi5sHXbkutxoDtVos7vuumvzwx/+cPnoxmTeDtW4H393ZBbZb4uIiIiIiIiIiIiADtUFoxNtGl/+8pfb1/siX/rSlzodpem1szp5dKjKEHbkutyoDtXN4EzToboYdKiKiIiIiIiIiIjIotGhumB0oo2Hnaf7779/6yj44Ac/2LvrlPNcx/UvfOELm1//+tfLZ8ajQ1WGsCPXpQ7V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jyNfPDiCk68UDvK+hrpAL0O30rKdWt5dzFIXU/sY0hnxPfGJT1zpE3B60r7Htp1SHkhX9AvpuFKqO9p93qc897nPXck/O19zYhdq5IH46FuCKW1tSBvu0wGgLnBMcx1xxfi1xx57tGnhNcfzcqhCX79d46STTmrvyTwhdzqLiIiIiIiIiIiIBAt1qIYxmm+54eRMjZ1f+tKXVu3gycEQ/OEPf7j9RmgYmTEYY+guGbivvfba1jDKNVwb17/5zW+uOkR+8YtftLsgMXxzPYZrdvkRd59R+YorrmiOP/74FWM3BmOcFzg483zhGOR1nHEtzo2rrrqqPdfnPBlbDtCX9r44S4zVgYBjnOMarp0CO1HJbzhAo7wx0LMrlTLqgzrA2RF62FWO1B/XYmDnOv7mr8zEeYKTHgfBEB2AvF2wM3Zsu+DbjuykCp0lLOVSykce31goVxxAUQ5D2kef7gU4kM4999w2z+Q97o9TslZ+NWZxwsCVV165qkyjLj73uc917ljratdd9LWZvvNd+eF66iz6QXTyuOOOa/vAvnKgXnESo09ch27R79D/pG1s1vLuYkpdTO1jaMMXXnhh67QlHvJLXOxQnaXtXHTRRW0/QNmTB8rz7LPPbtMf7aNUNqSH3cBp2OjnuvLPK25JN+nnenZ+poxta0PacJ8OBLy2nL4pHZdxFlPH1HXOLLo1pN8uwT0f/vCHu0NVREREREREREREOhnkUB3LrI4cEREREREREREREREREZGNgA5VEREREREREREREREREZEKOlRFRERERERERERERERERCroUBURERERERERERERERERqaBDVURERERERERERERERESkgg5VEREREREREREREREREZEKC3GoioiIiIiIiIiIiIiIiIhsBXSoioiIiIiIiIiIiIiIiIhU0KEqIiIiIiIiIiIiIiIiIlJBh6qIiIiIiIiIiIiIiIiISAUdqiIiIiIiIiIiIiIiIiIiFXSoioiIiIiIiIiIiIiIiIhU0KEqIiIiIiIiIiIiIiIiIlKkaf5/s9Tf8xyRjisAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc = [nlp(text) for text, annotation in [test_data[random.randint(0, len(test_data))]]][0]\n",
    "spacy.displacy.render(doc, style='ent')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using Transformer-based models\n",
    "`spacy-transformers` package provides spaCy model pipelines that wrap Hugging Face's [transformers package](https://github.com/huggingface/transformers) for convenient access to state-of-the-art transformer architectures, such as [BERT](https://arxiv.org/abs/1810.04805), [GPT-2](https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf), [XLNet](https://arxiv.org/abs/1906.08237), etc. Those models were pretrained on a massive amount of text using language models (LM).   \n",
    "\n",
    "In this tutorial, we'll be using English BERT (uncased, large).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install spacy-transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !python -m spacy download en_trf_bertbaseuncased_lg\n",
    "# # Restart kernel after the model is downloaded"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "# Use CUDA tensor\n",
    "if spacy.prefer_gpu():\n",
    "    torch.set_default_tensor_type(\"torch.cuda.FloatTensor\")\n",
    "\n",
    "# Load model\n",
    "nlp = spacy.load(\"en_trf_bertbaseuncased_lg\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sentencizer', 'trf_wordpiecer', 'trf_tok2vec']\n"
     ]
    }
   ],
   "source": [
    "# Pipeline is different from normal spaCy\n",
    "print(nlp.pipe_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Similarity check  \n",
    "Unlike normal word vectors, LM-based models like BERT return contextualized word vectors.  This feature hooks to existing spaCy's `similarity` method. \n",
    "\n",
    "Similarly, you can hook your own model (e.g. `Natural Language Inference` (entailment, neutral, contradiction)) that was trained in another ML framework like TensorFlow, to spaCy's `similarity` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7342854\n",
      "0.43365765\n"
     ]
    }
   ],
   "source": [
    "apple1 = nlp(\"Apple shares rose on the news.\")\n",
    "apple2 = nlp(\"Apple sold fewer iPhones this quarter.\")\n",
    "apple3 = nlp(\"Apple pie is delicious.\")\n",
    "print(apple1[0].similarity(apple2[0]))  # Both refer to Apple (company)\n",
    "print(apple1[0].similarity(apple3[0]))  # Apple (company) and Apple (food)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(0.54049635, dtype=float32)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Sentence-level similarity\n",
    "apple1.similarity(apple3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((9, 768), (10, 768), (7, 768))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# (num_wordpieces_tokens, vector_size)\n",
    "# [CLS] token embedding can be retrieved by trf_last_hidden_state[0]  \n",
    "apple1._.trf_last_hidden_state.shape, apple2._.trf_last_hidden_state.shape, apple3._.trf_last_hidden_state.shape,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['[CLS]', 'apple', 'sold', 'fewer', 'iphone', '##s', 'this', 'quarter', '.', '[SEP]']\n"
     ]
    }
   ],
   "source": [
    "# print wordpieces\n",
    "print(apple2._.trf_word_pieces_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Transfer Learning  \n",
    "The pretrained transformer models can be also used for transfer learning. Similar to computer vision's pretrained models (e.g. ResNet, Inception), you can start training on your smaller dataset with labels specific to your problem. Fine-tuning (changing the weights of the pretrained models) is possible by `nlp.update`.  \n",
    "\n",
    "Transfer learning is only available for pre-defined spaCy's pipelines (for `spacy-transformers`, only `trf_textcat`), so it cannot be used for other unrelated tasks like reading comprehension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from spacy.util import minibatch\n",
    "import spacy_transformers\n",
    "from spacy_transformers.util import cyclic_triangular_rate\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(99989, 3)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/train.csv.zip', sep=',', compression='zip', encoding='latin_1')\n",
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Slighly imbalanced data\n",
    "df.Sentiment.value_counts().plot(kind=\"bar\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Splitting to train+val and test\n",
    "trainval_X, test_X, trainval_y, test_y = train_test_split(df[['SentimentText']], df[['Sentiment']].values,\n",
    "                                                test_size = .15,\n",
    "                                                random_state=1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "trainval_X['Sentiment'] = trainval_y\n",
    "\n",
    "#Splitting to train and val\n",
    "train_X, val_X, train_y, val_y = train_test_split(trainval_X[['SentimentText']], trainval_X[['Sentiment']].values,\n",
    "                                                  test_size = .18,\n",
    "                                                  random_state=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((69691, 1), (15299, 1), (14999, 1))"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_X.shape, val_X.shape, test_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def prepare_data(data_X:pd.DataFrame=None, data_y:np.array=None, text_column:str='text'):\n",
    "    labels = [{\"1\": bool(y), \"0\": not bool(y)} for y in data_y]\n",
    "    texts = tuple(data_X[text_column].values.tolist())\n",
    "    combined_data = list(zip(texts, [{\"cats\": cats} for cats in labels]))\n",
    "    \n",
    "    return combined_data, texts, labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Padding is done automatically with subbatching, which regroups the batched sentences by sequence length, to minimise the amount of padding required. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Format data for spaCy\n",
    "train_data, train_text, train_label = prepare_data(train_X, train_y, \"SentimentText\")\n",
    "val_data, val_text, val_label = prepare_data(val_X, val_y, \"SentimentText\")\n",
    "test_data, test_text, test_label = prepare_data(test_X, test_y, \"SentimentText\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a pipeline for text classification\n",
    "textcat = nlp.create_pipe(\"trf_textcat\", config={\"exclusive_classes\": True, \"architecture\": \"softmax_class_vector\"})\n",
    "for label in (\"1\", \"0\"):\n",
    "    textcat.add_label(label)\n",
    "nlp.add_pipe(textcat, last=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Evaluation function\n",
    "def evaluate_classifier(nlp:spacy_transformers.language.TransformersLanguage=None, \n",
    "                        val_text:tuple=None, \n",
    "                        val_label:list=None, \n",
    "                        batch_size:int=32):\n",
    "    proba_list = []\n",
    "    label_list = []\n",
    "    \n",
    "    for i, doc in enumerate(nlp.pipe(val_text, batch_size=batch_size)):\n",
    "        pred = doc.cats['1']\n",
    "        label = 1.0 if val_label[i]['1'] else 0.0\n",
    "        proba_list.append(pred)\n",
    "        label_list.append(label)\n",
    "    \n",
    "    pred_indices = np.round(proba_list)\n",
    "    accuracy = accuracy_score(label_list, pred_indices)\n",
    "    roc_auc = roc_auc_score(label_list, proba_list)\n",
    "    f1 = f1_score(label_list, pred_indices)\n",
    "    precision = precision_score(label_list, pred_indices)\n",
    "    recall = recall_score(label_list, pred_indices)\n",
    "    \n",
    "    return {'accuracy': accuracy, 'roc_auc': roc_auc, 'f1': f1, 'precision': precision, 'recall': recall}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Optimizer (Adam)\n",
    "optimizer = nlp.resume_training()\n",
    "optimizer.alpha = 0.001\n",
    "optimizer.trf_weight_decay = 0.005\n",
    "optimizer.L2 = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_classifier(n_epoch:int=5, \n",
    "                     train_data:list=None, \n",
    "                     val_text:tuple=None, \n",
    "                     val_label:list=None, \n",
    "                     batch_size:int=32, \n",
    "                     lr:float=1e-3):\n",
    "    train_stats = []\n",
    "    dropout = decaying(0.2, 0.1, 0.3) # Gradually decrease dropout rate from 0.2 to 0.1\n",
    "    # Cyclic triangular rate (https://arxiv.org/abs/1506.01186)\n",
    "    learn_rates = cyclic_triangular_rate(\n",
    "        lr / 3, lr * 3, 2 * len(train_data) // batch_size\n",
    "    )\n",
    "\n",
    "    for epoch in range(n_epoch):\n",
    "        random.shuffle(train_data)\n",
    "        batches = minibatch(train_data, size=batch_size)\n",
    "        losses = {}\n",
    "\n",
    "        for batch in batches:\n",
    "            optimizer.trf_lr = next(learn_rates)\n",
    "            texts, cats = zip(*batch)\n",
    "            nlp.update(\n",
    "                texts, \n",
    "                cats, \n",
    "                drop = next(dropout),\n",
    "                sgd = optimizer,\n",
    "                losses=losses)\n",
    "\n",
    "        print(f\"Epoch: {epoch+1}\")\n",
    "        print(f\"Losses: {losses}\")\n",
    "        \n",
    "        with nlp.use_params(optimizer.averages):\n",
    "            val_score = evaluate_classifier(nlp, val_text, val_label, batch_size)\n",
    "\n",
    "        print(val_score)\n",
    "\n",
    "        train_stats.append(losses)\n",
    "        train_stats.append(val_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 1\n",
      "Losses: {'trf_textcat': 0.740542416649987}\n",
      "{'accuracy': 0.7903784561082424, 'roc_auc': 0.8687040302849849, 'f1': 0.8193341220212945, 'precision': 0.7986820428336079, 'recall': 0.8410825815405968}\n",
      "Epoch: 2\n",
      "Losses: {'trf_textcat': 0.6592710536715458}\n",
      "{'accuracy': 0.8004444734949997, 'roc_auc': 0.8743129609314639, 'f1': 0.8263861245379585, 'precision': 0.8128425998433829, 'recall': 0.8403886190145732}\n",
      "Epoch: 3\n",
      "Losses: {'trf_textcat': 0.6218109232067945}\n",
      "{'accuracy': 0.8072423034185241, 'roc_auc': 0.8829449608338314, 'f1': 0.8343537606021456, 'precision': 0.8110734956863601, 'recall': 0.8590099467962063}\n",
      "Epoch: 4\n",
      "Losses: {'trf_textcat': 0.586101518390933}\n",
      "{'accuracy': 0.8087456696516112, 'roc_auc': 0.8840642835508836, 'f1': 0.8362252322847868, 'precision': 0.8101952277657267, 'recall': 0.8639833448993754}\n",
      "Epoch: 5\n",
      "Losses: {'trf_textcat': 0.5791687902383273}\n",
      "{'accuracy': 0.8085495784038172, 'roc_auc': 0.8853615213060473, 'f1': 0.8355510639492449, 'precision': 0.8118930714675395, 'recall': 0.8606291926902614}\n"
     ]
    }
   ],
   "source": [
    "train_classifier(n_epoch=5, train_data=train_data, val_text=val_text, val_label=val_label, batch_size=32, lr=2e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'accuracy': 0.8085495784038172,\n",
       " 'roc_auc': 0.8853615213060473,\n",
       " 'f1': 0.8355510639492449,\n",
       " 'precision': 0.8118930714675395,\n",
       " 'recall': 0.8606291926902614}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on val set\n",
    "evaluate_classifier(nlp, val_text, val_label, 32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Weight averaging (https://www.aclweb.org/anthology/P04-1015/)\n",
    "with nlp.use_params(optimizer.averages):\n",
    "    nlp.to_disk('model/bert_textcat_wa')\n",
    "    \n",
    "nlp_wa = nlp.from_disk('model/bert_textcat_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'accuracy': 0.8096539769317954,\n",
       " 'roc_auc': 0.8884111784230834,\n",
       " 'f1': 0.8315534839813556,\n",
       " 'precision': 0.8431442928930366,\n",
       " 'recall': 0.8202770341054592}"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on val set\n",
    "evaluate_classifier(nlp, val_text, val_label, 32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'accuracy': 0.8175211680778719,\n",
       " 'roc_auc': 0.8917429357669111,\n",
       " 'f1': 0.8439655663873212,\n",
       " 'precision': 0.8270391061452514,\n",
       " 'recall': 0.861599348155046}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate on test set\n",
    "evaluate_classifier(nlp_wa, test_text, test_label, 32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Predict function\n",
    "def predict(nlp:spacy_transformers.language.TransformersLanguage=None, \n",
    "            val_text:tuple=None, \n",
    "            batch_size:int=32):\n",
    "    \n",
    "    proba_list = []\n",
    "    \n",
    "    for i, doc in enumerate(nlp.pipe(val_text, batch_size=batch_size)):\n",
    "        pred = doc.cats['1']\n",
    "        proba_list.append(pred)\n",
    "    \n",
    "    return proba_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "probas = predict(nlp_wa, test_text)\n",
    "pred_indices = np.round(probas)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "skplt.plot_confusion_matrix(test_y, pred_indices, figsize=(5,5), normalize=True);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "skplt.plot_confusion_matrix(test_y, pred_indices, figsize=(5,5), normalize=False);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Calculate the best precision, recall, f1 score\n",
    "def calc_prec_recall_f1(y_true:np.ndarray=None, y_pred:list=None):\n",
    "    thresh_list = []\n",
    "    thresholds = []\n",
    "    for thresh in np.arange(0.01, 1.0, 0.01):\n",
    "        thresh = np.round(thresh, 2)\n",
    "        recall_res = recall_score(y_true, (y_pred > thresh).astype(int))\n",
    "        prec_res = precision_score(y_true, (y_pred > thresh).astype(int))\n",
    "        f1_res = f1_score(y_true, (y_pred > thresh).astype(int))\n",
    "        thresh_list.append([thresh, recall_res, prec_res, f1_res])\n",
    "        thresholds.append([thresh, recall_res, prec_res, f1_res])\n",
    "\n",
    "    # Ordered by F-1 in descending\n",
    "    thresholds.sort(key=lambda x: x[3], reverse=True)\n",
    "    best_thresh = thresholds[0][0]\n",
    "    best_recall = thresholds[0][1]\n",
    "    best_prec = thresholds[0][2]\n",
    "    best_f1 = thresholds[0][3]\n",
    "    return  thresh_list, best_recall, best_prec, best_f1, best_thresh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal Recall: 0.8837155162379234 Precision: 0.8138064101189838 F1: 0.8473214285714286 at threshold: 0.45\n"
     ]
    }
   ],
   "source": [
    "thresh_list, best_recall, best_prec, best_f1, best_threshold = calc_prec_recall_f1(test_y, probas)\n",
    "print(f'Optimal Recall: {best_recall} Precision: {best_prec} F1: {best_f1} at threshold: {best_threshold}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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UU5OzsECHBMTI0natm2bhg4dql69eqlnz56aOXOmJCkjI0MlJSWSpMcff1w9e/ZUz5499eSTTx7M1b17d40fP15ZWVk677zztH//fm//eAAAAFzSt3Gc8K49DR3IF2eOCHM6wHFNvV/avsy9x0w9Qzr//066W0FBgV555RUNHjxYN998s5599llJUlRUlL7//ntJ0jnnnKPnn39enTt31ty5c3X77bdr+vTpuuuuu3TWWWfpo48+Ul1dncrLyw879jvvvKORI0fqgQceUF1dnSorKw/bvmDBAr322muaO3eurLXq37+/zjrrLCUkJGjt2rV699139dJLL+mqq67Shx9+qHHjxrnphwMAAOA+2ektFBEaovXbwxRiQnzyjrDvFmEHtW3bVoMHD5YkjRs3Tk899ZQk6eqrr5YklZeXa9asWbryyisPfubAgQOSpOnTp+vNN9+UJIWGhqpFixaHHbtv3766+eabVVNTo0suuUS9evU6bPv333+vSy+9VNHR0ZKkyy67TDNnztTo0aPVoUOHg/v36dNHhYWFbv7OAQAA3CMqPFRnpLfQwo371Cq5lU9Ooea7RdiFO7eeYow55uufyml9fb3i4+O1ePHiUz720KFD9d133+nzzz/Xddddp3vvvVfXX3/9we3W2uN+NjIy8uDXoaGhDI0AAAA+LS8jQa9+/6MGZbTxySnUGCN8DJs2bdLs2bMlSe+++67OPPPMw7bHxcWpQ4cOev/99yU1lNclS5ZIahgy8dxzz0lqeKiurKzssM9u3LhRKSkpGj9+vG655RYtXLjwsO1Dhw7Vxx9/rMrKSlVUVOijjz7SkCFDPPJ9AgAAeFLf9omqqbNqZlJ8cmgERfgYunfvrjfeeEPZ2dnavXu3JkyYcNQ+EydO1CuvvKKcnBxlZWXpk08+kST94x//0LfffqszzjhDffr00YoVKw773IwZM9SrVy/17t1bH374oe6+++7Dtufm5urGG29Uv3791L9/f916663q3bu3575ZAAAAD+nTPkGSVF0Vr/KaclXXVTuc6HDmRL+K96S8vDybn59/2HurVq1S9+7dHcnzk8LCQl100UVavny5ozmayhd+hgAAAD8Z8fh/1DohXG/cOPCo4afeYoxZYK3NO/J97ggDAADAY/IyErVo4z7VO3Pv9YQowkfIyMjw27vBAAAAvqZvRoL2VdVqzY59Tkc5CkUYAAAAHvPTwhr5hbsdTnI0ijAAAAA8Jj2hmVrFRWp+YanTUY5CEQYAAIDHGGOUl5Hok3eEfXdBDQAAAASEIZlJKq2oVsWBWkVH+k795I7wEZ566il1795dl19+uQYOHKjIyEj9/e9/dzoWAACA37qmXzu9M36AT5VgiTvCR3n22Wc1depURUdHa+PGjfr444+djgQAAAAPcOmOsDFmlDGmwBizzhhz/zG2RxpjJjVun2uMyXB3UG/4xS9+oQ0bNmj06NGaOHGi+vbtq/DwcKdjAQAAwANOekfYGBMq6RlJIyQVSZpvjJlsrV15yG63SCq11mYaY66R9Iikq08n2CPzHtHq3atP5xBH6ZbYTff1u++4259//nl98cUX+vbbb5WUlOTWcwMAAMC3uHJHuJ+kddbaDdbaaknvSRpzxD5jJL3R+PUHks4xTq2hBwAAALjAlTHCaZI2H/K6SFL/4+1jra01xuyV1FJSSVODnejOLQAAAHC6XLkjfKw7u0euFu3KPjLG3GaMyTfG5BcXF7uSDwAAAPAIV+4IF0lqe8jrdElbj7NPkTEmTFILSUfNmmytfVHSi5KUl5d3VFH2Jdu3b1deXp7KysoUEhKiJ598UitXrlRcXJzT0QAAAOAGrhTh+ZI6G2M6SNoi6RpJPztin8mSbpA0W9IVkqZba3266B5PYWHhwa+LioqcCwIAAACPOmkRbhzze4ekLyWFSnrVWrvCGPOgpHxr7WRJr0h6yxizTg13gq/xZGgAAADgdLm0oIa1doqkKUe894dDvq6SdKV7owEAAACewxLLAAAACEo+V4T9dGixT+BnBwAA4DqfKsJRUVHatWsXha4JrLXatWuXoqKinI4CAADgF1waI+wt6enpKioqEnMMN01UVJTS09OdjgEAAOAXfKoIh4eHq0OHDk7HAAAAQBDwqaERAAAAgLdQhAEAABCUKMIAAAAISsapGRqMMcWSNnrwFEmSSjx4fPgernlw4XoHF653cOF6BxdvXO/21trkI990rAh7mjEm31qb53QOeA/XPLhwvYML1zu4cL2Di5PXm6ERAAAACEoUYQAAAASlQC7CLzodAF7HNQ8uXO/gwvUOLlzv4OLY9Q7YMcIAAADAiQTyHWEAAADguPy+CBtjRhljCowx64wx9x9je6QxZlLj9rnGmAzvp4S7uHC9f22MWWmMWWqM+cYY096JnHCfk13zQ/a7whhjjTE8ae7HXLnexpirGv+erzDGvOPtjHAfF/6d3s4Y860xZlHjv9cvcCIn3MMY86oxZqcxZvlxthtjzFON/zwsNcbkejqTXxdhY0yopGcknS+ph6SxxpgeR+x2i6RSa22mpCckPeLdlHAXF6/3Ikl51tpsSR9I+pt3U8KdXLzmMsbESrpL0lzvJoQ7uXK9jTGdJf1O0mBrbZake7weFG7h4t/v30v6l7W2t6RrJD3r3ZRws9cljTrB9vMldW78c5uk5zwdyK+LsKR+ktZZazdYa6slvSdpzBH7jJH0RuPXH0g6xxhjvJgR7nPS622t/dZaW9n4co6kdC9nhHu58ndckv6ihv/oqfJmOLidK9d7vKRnrLWlkmSt3enljHAfV663lRTX+HULSVu9mA9uZq39TtLuE+wyRtKbtsEcSfHGmNaezOTvRThN0uZDXhc1vnfMfay1tZL2SmrplXRwN1eu96FukTTVo4ngaSe95saY3pLaWms/82YweIQrf8e7SOpijPnBGDPHGHOiu0vwba5c7z9JGmeMKZI0RdKd3okGh5zq/8+ftjBPHtwLjnVn98hpMFzZB/7B5WtpjBknKU/SWR5NBE874TU3xoSoYcjTjd4KBI9y5e94mBp+bTpMDb/xmWmM6Wmt3ePhbHA/V673WEmvW2sfM8YMlPRW4/Wu93w8OMDrnc3f7wgXSWp7yOt0Hf1rk4P7GGPC1PCrlRPdlofvcuV6yxhzrqQHJI221h7wUjZ4xsmueayknpJmGGMKJQ2QNJkH5vyWq/9O/8RaW2Ot/VFSgRqKMfyPK9f7Fkn/kiRr7WxJUZKSvJIOTnDp/+fdyd+L8HxJnY0xHYwxEWoYSD/5iH0mS7qh8esrJE23TJ7sr056vRt/Tf6CGkowYwf93wmvubV2r7U2yVqbYa3NUMO48NHW2nxn4uI0ufLv9I8lnS1JxpgkNQyV2ODVlHAXV673JknnSJIxprsainCxV1PCmyZLur5x9ogBkvZaa7d58oR+PTTCWltrjLlD0peSQiW9aq1dYYx5UFK+tXaypFfU8KuUdWq4E3yNc4lxOly83o9KipH0fuMzkZustaMdC43T4uI1R4Bw8Xp/Kek8Y8xKSXWS7rXW7nIuNZrKxev9G0kvGWN+pYZfkd/IzSz/ZYx5Vw3DmpIax33/UVK4JFlrn1fDOPALJK2TVCnpJo9n4p8nAAAABCN/HxoBAAAANAlFGAAAAEGJIgwAAICgRBEGAABAUKIIAwAAIChRhAHATYwxLY0xixv/bDfGbGn8ek/jdF/uPt8wY8wpLS1tjJlxrAVHjDE3GmOedl86APB9FGEAcBNr7S5rbS9rbS9Jz0t6ovHrXpJOuiRs4+qXAAAvoQgDgHeEGmNeMsasMMZMM8Y0kw7eoX3YGPMfSXcbY5KNMR8aY+Y3/hncuN9Zh9xtXmSMiW08bowx5gNjzGpjzETTuJKMMeacxv2WGWNeNcZEHhnIGHOTMWZN47kHe+nnAAA+gyIMAN7RWdIz1tosSXskXX7Itnhr7VnW2sck/UMNd5L7Nu7zcuM+/yXpl413mIdI2t/4fm9J90jqIamjpMHGmChJr0u62lp7hhpWEZ1waBhjTGtJf1ZDAR7R+HkACCoUYQDwjh+ttYsbv14gKeOQbZMO+fpcSU8bYxZLmiwprvHu7w+SHjfG3KWG4lzbuP88a22RtbZe0uLG43ZtPN+axn3ekDT0iDz9Jc2w1hZba6uPyAAAQYHxaADgHQcO+bpOUrNDXlcc8nWIpIHW2v063P8ZYz6XdIGkOcaYc49z3DBJxsVM1sX9ACAgcUcYAHzLNEl3/PTCGNOr8X87WWuXWWsfkZQvqdsJjrFaUoYxJrPx9XWS/nPEPnMlDWuc6SJc0pXu+gYAwF9QhAHAt9wlKc8Ys7RxyrVfNL5/jzFmuTFmiRrGB0893gGstVWSbpL0vjFmmRpmrHj+iH22SfqTpNmSvpa00N3fCAD4OmMtvxkDAABA8OGOMAAAAIISRRgAAABBiSIMAACAoEQRBgAAQFCiCAMAACAoUYQBAAAQlCjCAAAACEoUYQAAAASl/wftLJH8TjoL+wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "thresh_list = np.array(thresh_list)\n",
    "threshold = thresh_list[:,0]\n",
    "recall_list = thresh_list[:,1]\n",
    "precision_list = thresh_list[:,2]\n",
    "f1_list = thresh_list[:,3]\n",
    "\n",
    "plt.figure(figsize = (12, 8))\n",
    "plt.plot(threshold, recall_list, label='recall')\n",
    "plt.plot(threshold, precision_list, label='precision')\n",
    "plt.plot(threshold, f1_list, label='f1')\n",
    "plt.title('Recall, Precision, F1')\n",
    "plt.xlabel('Threshold')\n",
    "plt.legend()\n",
    "plt.show();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ROC curve\n",
    "fp, tp, thresholds = roc_curve(test_y, probas)\n",
    "\n",
    "plt.figure(figsize = (8, 6))\n",
    "plt.plot(fp, tp)\n",
    "plt.title(\"ROC curve\")\n",
    "plt.xlabel( \"False Positive Rate\")\n",
    "plt.ylabel(\"True Positive Rate\")\n",
    "plt.show();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Comparison between prediction and true label distribution\n",
    "test_pd = pd.DataFrame(pred_indices, columns=['pred'])\n",
    "test_pd['probas'] = probas\n",
    "\n",
    "label_list = []\n",
    "\n",
    "for i in test_label:\n",
    "    label = 1.0 if i['1'] else 0.0\n",
    "    label_list.append(label)\n",
    "    \n",
    "test_pd['label'] = label_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(test_pd[test_pd.label == 1].probas, kde=False, bins=100, color='blue', label='Positive', norm_hist=True)\n",
    "sns.distplot(test_pd[test_pd.label == 0].probas, kde=False, bins=100, color='orange', label='Negative', norm_hist=True)\n",
    "\n",
    "plt.rcParams[\"figure.figsize\"] = (20, 10)\n",
    "plt.rcParams[\"font.size\"] = 20\n",
    "plt.rcParams[\"axes.labelsize\"] = 10\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Annotation by Prodigy  \n",
    "[Prodigy](https://prodi.gy/) is an annotation tool that enables users to do annotation themselves via web browser. It's powered by active learning so you're asked to annotate examples that the model is unsure about. By default, it comes with **recipes** for text classification, NER, image classification, object detection, etc, but users can also build their own recipes.\n",
    "\n",
    "***This is NOT open source, so license is required. For an open source option, [doccano](https://github.com/doccano/doccano) is recommended."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(99989, 3)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/train.csv.zip', sep=',', compression='zip', encoding='latin_1')\n",
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save only text column as csv format for annotation\n",
    "df.SentimentText.to_csv(\"data/test_prodigy.csv\", header=False, index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Run Prodigy  \n",
    "1. Start the web app.  \n",
    "2. Hit `localhost:8888` on your browser.  \n",
    "\n",
    "### Use Prodigy for annotation\n",
    "1. Use pre-trained spaCy model to start creating manually annotated data set (~1000):  \n",
    "`prodigy ner.teach my_set en_core_web_lg data/test_prodigy.csv`\n",
    "2. Train a model:  \n",
    "`prodigy train ner my_set en_core_web_lg --output model/ner_v1 --n-iter 5 --eval-split 0.2 --dropout 0.2`\n",
    "3. Iterate (`ner.correct` <-> `train`) until performance is satisfactory:  \n",
    "`prodigy ner.correct my_set model/ner_v1 data/test_prodigy.csv`  \n",
    "`prodigy train ner my_set model/ner_v1 --output model/ner_v2 --n-iter 5 --eval-split 0.2 --dropout 0.2`  \n",
    "`prodigy ner.correct my_set model/ner_v2 data/test_prodigy.csv`  \n",
    "...\n",
    "4. Done. The trained model is compatible with spaCy.\n",
    "5. Optionally, output the training data set as JSONL:  \n",
    "`prodigy ner.gold-to-spacy my_set data/ner_gold.jsonl --biluo --spacy-model model/ner_v8`\n",
    "6. You can use the annotated data to train in your favoriate ML framework. For example, the data can be converted to be used in AllenNLP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('data/ner_gold.jsonl') as json_file:\n",
    "    prodigy_gold = [json.loads(jline) for jline in json_file]\n",
    "    \n",
    "text_ner = []\n",
    "for row in prodigy_gold:\n",
    "    text = row[0]\n",
    "    label = row[1]\n",
    "    \n",
    "    text_concat = \"\"\n",
    "    counter = 0\n",
    "    \n",
    "    for token in text.split(\" \"):\n",
    "        text_with_annotation = token + \"#\" + label[counter]\n",
    "        text_concat = text_concat + text_with_annotation + \" \"\n",
    "        counter += 1\n",
    "\n",
    "    text_ner.append(text_concat.strip())\n",
    "\n",
    "\n",
    "ner_pd = pd.DataFrame(text_ner, columns=['text'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Split into train and val\n",
    "train_X, val_X = train_test_split(ner_pd, test_size=0.2, random_state=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save\n",
    "train_X.to_csv(\"data/ner_train_allennlp.csv.bz2\", compression='bz2', header=False, index=False)\n",
    "val_X.to_csv(\"data/ner_val_allennlp.csv.bz2\", compression='bz2', header=False, index=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
